[英]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
。 atoi
和strtol
之間最明顯的區別是strtol
告訴你它走了多遠,它使用了多少位。 它通過向您返回指向它未使用的第一個字符的指針來做到這一點。
但是,這意味着要使用strtol
您將不得不顯式使用指針。 如果使用指針會容易得多
char *p;
逐步通過buffer
,而不是索引i
。 但是你可以這樣說
char *endp;
value1 = strtol(p, &endp, 10);
p = endp;
if (*p == '+')
...
它的工作方式是, strtol
將endp
設置為指向它未使用的第一個字符。 這就是您要繼續解析的地方,因此您將p
設置為endp
並繼續。
這里實際發生的是strtol
接受指向指針的指針。 如果您還不習慣使用指針,那么您可能真的還沒有准備好考慮指向指針的指針,但相信我,這是可行的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.