簡體   English   中英

如何區分 C 中的單個數字和多個數字作為字符?

[英]How to differentiate between single digit numbers and multiple digit numbers as chars in C?

所以,我正在從標准輸入讀取輸入,我必須從中計算算術。 例如,我可能會得到:

3+4
4+3
7+9

然后將其放入 char 數組中,如下所示:

{3+4;4+3;7+9}

我想創建一個程序來接受這個輸入並返回:

{7;7;16}

由於這是來自 C 中的標准輸入,因此每個元素都是 char 類型。 我創建了以下代碼來像這樣處理 arrays 並返回正確的結果:

char *int2string(int i, char *s)
{
    sprintf(s, "%d", i);
    return s;
}

        bufferlen = strlen(buffer);
        int result;
        for (i = 0; i < bufferlen; i++)
        {
            if (isNumeric(buffer[i]))
            {
                value1 = atoi(&buffer[i]);
                if (buffer[i + 1] == '+')
                {
                    if (isNumeric(buffer[i + 2]))
                    {
                        value2 = atoi(&buffer[i + 2]);
                        result = value1 + value2;
                        printf("This is the result: %d\n", result);
                        int2string(result, &buffer[i]);
                        for (int k = i + 1; k < bufferlen; k++)
                        {
                            buffer[k] = buffer[k + 2];
                        }
                        //bufferlen = bufferlen - 2;
                    }
                }
            }
        }

不幸的是,我的代碼僅適用於由一個字符組成的輸入並返回一個只有一個字符的值。 如果我要運行這個:

34+22

我的代碼返回以下內容:

This is the result: 26
322;

我相信這是因為我的代碼一次只能讀取一個字符,並且無法區分單個數字和由多個數字組成的數字。 有什么辦法可以解決這個問題嗎?

您可以使用sscanf來獲取運算符和任意數字。 您可以按如下方式使用它:

int sum, len;
sscanf(buffer, "%d%n", &sum, &len); // get the first number

int number;
char op;

buffer += len;

// then pattern is: "operation""number"
while(sscanf(buffer, "%c%d", &op, &number) == 2) // while you can scan both operation and number
{
    if (op == '+')
        sum += number;
    else if (op == '-')
        sum -= number;
    ...
}

更多關於 sscanf的信息

我認為你的問題是你正在做類似的事情

value1 = atoi(&buffer[i]);
if (buffer[i + 1] == '+')
    ...

在這個片段中,索引i “指向” buffer中您當前正在解析的位置。 您相信(並且正確地如此) i “指向”一個或多個數字字符中的第一個。 您調用atoi將該/那些數字轉換為實際的 integer。 到目前為止一切順利。 但是隨后您測試buffer[i + 1]以查看數字后是否有操作符字符。 這就是產生不正確假設的地方,即數字總是一位數。 這就是您需要解決的問題才能正確處理多位數字。

我想說,解決這個問題的最好方法是使用strtol而不是atoi atoistrtol之間最明顯的區別是strtol告訴你它走了多遠,它使用了多少位。 它通過向您返回指向它未使用的第一個字符的指針來做到這一點。

但是,這意味着要使用strtol您將不得不顯式使用指針。 如果使用指針會容易得多

char *p;

逐步通過buffer ,而不是索引i 但是你可以這樣說

char *endp;
value1 = strtol(p, &endp, 10);
p = endp;
if (*p == '+')
    ...

它的工作方式是, strtolendp設置為指向它未使用的第一個字符。 這就是您要繼續解析的地方,因此您將p設置為endp並繼續。

這里實際發生的是strtol接受指向指針的指針 如果您還不習慣使用指針,那么您可能真的還沒有准備好考慮指向指針的指針,但相信我,這是可行的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM