您測試mathSign == 'a'
但mathSign
是一個數組,因此您應該編寫mathSign[0] == 'a'
。編譯器應該已經產生了警告。你不應該忽視這些警告,它們表明問題通常是真正的錯誤。您可以通過提高警告級別獲得更多有用的診斷:gcc -Wall -W -Werror
或clang -Weverything -Werror
...
注意scanf("%s", mathSign);
會導致如果用戶鍵入超過19個字符長的單詞的緩衝區溢出。您應該保護與目標數組:
scanf("%19s", mathSign);
此外,你應該檢查轉換成功,否則,你可能有不確定的行爲,如果輸入無法轉換,你使用的仍然未初始化的值。
您可以使用" %c"
來讀取單個字符並使用經典操作符以提高可讀性。請注意0之前的空格:它允許scanf()
跳過空白字符,例如前一個響應中的換行符。
下面是修改後的版本:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int firstNumber, secondNumber, answer;
char mathSign;
printf("Enter first number: ");
if (scanf("%d", &firstNumber) != 1)
return 1;
printf("Enter operation\n + - Add\n - = Subtract\n * - Multiply\n/- Divide\n");
if (scanf(" %c", &mathSign) != 1)
return 1;
printf("Enter second number: ");
if (scanf("%d", &secondNumber) != 1)
return 1;
if (mathSign == '+') {
answer = firstNumber + secondNumber;
} else if (mathSign == '-') {
answer = firstNumber - secondNumber;
} else if (mathSign == '*') {
answer = firstNumber * secondNumber;
} else if (mathSign == '/') {
answer = firstNumber/secondNumber;
} else {
printf("unsupported operation: %c\n", mathSign);
return 1;
}
printf("Your answer is %d\n", answer);
return 0;
}
可以進一步與switch
聲明簡化程序:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int firstNumber, secondNumber, answer;
char mathSign;
printf("Enter a simple expression: ");
if (scanf("%i %c%i", &firstNumber, &mathSign, &secondNumber) != 3)
return 1;
switch (mathSign) {
case '+': answer = firstNumber + secondNumber; break;
case '-': answer = firstNumber - secondNumber; break;
case '*': answer = firstNumber * secondNumber; break;
case '/': answer = firstNumber/secondNumber; break;
case '%': answer = firstNumber % secondNumber; break;
default:
printf("unsupported operation: %c\n", mathSign);
return 1;
}
printf("the result is %d\n", answer);
return 0;
}
'mathSign'是一個*數組*,即一個字符串。你用['strcmp']比較字符串(http://en.cppreference.com/w/c/string/byte/strcmp)。或者你可以比較'mathSign'的第一個*字符*和另一個字符。 –
另外,如果用戶輸入'mathSign'的一些輸入無效,該怎麼辦?你也需要處理這種情況(現在這種情況發生在無效比較中)。 –
爲什麼要使用char數組?你可以簡單地在這裏使用字符 –