2017-07-16 14 views
2

私はCに新しいですし、私はシンプルな電卓シンプルな電卓使用してCの問題は

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int firstNumber, secondNumber, answer; 
    char mathSign[20]; 

    printf("Enter first number \n"); 
    scanf("%d", &firstNumber); 

    printf("Enter sign \n a - Add \n s = Subtract \n m - Multiply \n d - Divide \n"); 
    scanf("%s", mathSign); 

    printf("Enter second number \n"); 
    scanf("%d", &secondNumber); 

    if (mathSign == 'a') { 
     answer = firstNumber + secondNumber; 
    } else if (mathSign == 's') { 
     answer = firstNumber - secondNumber; 
    } else if (mathSign == 'm') { 
     answer = firstNumber * secondNumber; 
    } else if (mathSign == 'd') { 
     answer = firstNumber/secondNumber; 
    } 

    printf("Your answer is %d", answer); 

    return 0; 
} 

答えは常に何らかの理由で52として終わるに作るしようとしています。整数を2倍にする必要がありますか?

+1

'mathSign'は*配列*、つまり文字列です。 ['strcmp'](http://en.cppreference.com/w/c/string/byte/strcmp)を使って文字列を比較します。あるいは、 'mathSign'の最初の*文字*と他の文字を比較できます。 –

+0

また、ユーザーが 'mathSign'の入力を無効にした場合はどうなりますか?その場合も処理する必要があります(この場合は無効な比較が行われます)。 –

+1

なぜchar配列を使用していますか?あなたは単にここでcharを使うことができます –

答えて

0

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; 
} 
+0

ありがとう!しかし、配列を作っていないときはいつでも、mathsを求める部分をスキップします。 –

+0

@AntonTruong: 'char mathSign; scanf( "%c"、&mathSign);実際には問題があります。演算子が必要になる前に空白のスペースをスキップします。そうしないと、保留中の改行を 'mathSign'に読み込む可能性があります。このために、書式文字列を 'scanf("%c "、mathSign)'に変更することができます。 – chqrlie

0

ただmathSignを使用すると、それは配列へのポインタです。 最初の要素にアクセスするには、mathSign[0]を使用する必要があります。また

、あなただけの看板のための1つの文字にあなたが正しいだろう。この場合scanf(" %c", mathSign); 比較mathSign == 'aを使用して記号文字を読んchar mathSign代わりのchar mathSign[20]を宣言することができます興味を持っているからです。

+0

オペレータが必要となる前にペンディングされている空白をスキップします。 'mathSign'に保留中の改行を読み込む可能性が高くなります。このために、フォーマット文字列を 'scanf("%c "、mathSign)' – chqrlie

+0

@chqrlieに変更することができます。ありがとうございました!コードが改善されました。 – sg7

1

は、このコードを試してみてください。これはうまくいくはずです。また、これは最適化されたものになります。

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int firstNumber, secondNumber, answer; 
    char mathSign; 

    printf("1.Enter first number \n"); 
    scanf("%d", &firstNumber); 

    printf("Enter sign \n a - Add \n s = Subtract \n m - Multiply \n d - Divide \n"); 
    scanf(" %c", &mathSign); 

    printf("Enter second number \n"); 
    scanf("%d", &secondNumber); 

    switch (tolower(mathSign)) { 
    case 'a': 
     answer = firstNumber + secondNumber; 
     break; 
    case 's': 
     answer = firstNumber - secondNumber; 
     break; 
    case 'm': 
     answer = firstNumber * secondNumber; 
     break; 
    case 'd': 
     answer = firstNumber/secondNumber; 
     break; 
    default: 
     printf("Invalid Choice"); 
     break; 
    } 

    printf("Your answer is %d", answer); 
    return 0; 
}