mathSign == 'a'
をテストしますが、mathSign
は配列なので、mathSign[0] == 'a'
と書く必要があります。コンパイラは警告を生成するはずです。これらの警告を無視すべきではなく、実際のバグであることが多い問題を示しています。あなたは警告レベルを上げることによって、より有益な診断を得ることができます:gcc -Wall -W -Werror
またはclang -Weverything -Werror
...
注ユーザーがいる場合scanf("%s", mathSign);
は単語長い19文字を超えるバッファオーバーフローを引き起こすこと。あなたとコピー先の配列を保護する必要があります。さらに
scanf("%19s", mathSign);
は、入力が変換できないと、あなたはまだ初期化されていない値を使用する場合はそうでなければ、未定義の動作をしている可能性があり、変換が成功したことを確認する必要があります。
" %c"
を使用して、単一の文字を読み込み、読みやすいように古典的な演算子を使用できます。 %c
の前のスペースに注意してください: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配列を使用していますか?あなたは単にここでcharを使うことができます –