1

実行する操作をユーザーに求める非常に単純な計算プログラムを使用し、その後にこの操作を実行する2つの整数のプロンプトを表示します。プログラムは、ユーザーが文字「q」を入力した場合を除いて、これらの操作の後にループすることになっています。その時点で、プログラムは終了することになっています。

#include <stdio.h>

int main (void)
    {
        char c;
        int number[2], num1, num2, result;
        double num1d, num2d, resultd;
        int done=1;

        while(done)
        {
        printf("\t What sort of operation would you like to perform? \n \t Type + - * / accordingly. \n");
        c = getchar();
        printf("\tplease enter a number \n");
        scanf("%d",&number[0]);
        printf("\tplease enter another number \n");
        scanf("%d",&number[1]);
        num1 = number[0];
        num2 = number[1];

        switch(c)
            {
            case('-'):
            result = num1-num2;
            printf("\nThe first number you entered subtracted by the second number is %d.\n", result);
            break;

            case('+'):
            result = num1+num2;
            printf("The first number you entered added to the second number is %d.\n", result);
            break;

            case('*'):
            result = num1*num2;
            printf("The first number you entered multiplied with the second number is %d.\n", result);
            break;

            case('/'):
            num1d = (double) num1;
            num2d = (double) num2;
            resultd = num1d/num2d;
            printf("The first number you entered divided by the second number is %g.\n", resultd);;
            break;

            case('q'):
            printf(" Now Exiting...\n");
            done=0;
            break;

            default:
            puts("Invalid key pressed. Press q to exit");
            break;
            }
        }

        return 0;
    }

1回の計算では正しく機能しますが、その後は奇妙に機能します。特にそれは印刷します

printf("\t What sort of operation would you like to perform? \n \t Type + - * / accordingly. \n");
printf("\tplease enter a number \n");

完全に。

入力バッファをクリアする標準的な方法では、while (getchar() != '\n');これは修正されません。このテキストが正しく表示されない場合の2回に1回は、ユーザーはプログラムを指示どおりに表示されているかのように使用できます(したがって、ユーザーは+、キャリッジリターン、整数、キャリッジリターンなどの操作を入力できます。プログラムはその時点から正しく実行されます)ただし、プログラムは入力に関係なく「無効なキーが押されました。qを押して終了します」と表示します。

4

4 に答える 4

4

ここにいる他のみんなが言っていることは真実です、getchar()しかしintそれはあなたの問題ではありません。

問題は、getchar()使用後に改行文字が残ることです。使用する場合は、後で必ず改行文字を使用getchar()する必要があります。この簡単な修正:

   printf("\t What sort of operation would you like to perform? \n \t Type + - * / accordingly. \n");
    c = getchar();
    getchar();     //<-- here we do an extra getchar for the \n
    printf("\tplease enter a number \n");
    scanf("%d",&number[0]);
    printf("\tplease enter another number \n");
    scanf("%d",&number[1]);

そしてそれは問題を排除します。入力するたび<somechar><enter>に、実際には2文字がバッファに配置されます。たとえば、+を押して入力すると、次のようになります。

'+''\n'  // [+][\n]

getchar()これらの最初のものだけを取得し、次にgetchar()呼び出されたときに入力を待たずに、それを取得してに'\n'進みます。scanf()

于 2012-11-19T12:28:14.753 に答える
3

文字ごとに、などのより高レベルの入力関数を混在させないでくださいscanf()。コマンド文字の入力にも使用scanf()することをお勧めしますが、もちろん、コマンドの後にEnterキーを押す必要があります。これがあなたの問題の根本的な原因だと思います。

余談ですが、名前にもかかわらず、はではなく、を返すことに注意しgetchar()ください。これは、すべての文字の値とは異なる値を持つ特別な定数であるを返すことができるためです。int charEOF

さらに、のようなI/O関数の戻り値を常にscanf()確認する必要があります。入力がパターン文字列と一致しない場合は失敗する可能性があります。

デバッグのヒントとして、もちろん、解釈する前にの値を出力cできるため、プログラムのフローを簡単に確認して理解することができます。

于 2012-11-19T12:03:43.637 に答える
2

初めては動作すると思いますが、次回は動作しません。これは、scanf呼び出しが入力バッファーに改行を残すため、次回getcharループで呼び出されると、改行文字が返されるためです。scanf呼び出しの形式の後にスペースを追加します

scanf("%d ",&number[0]);

残りの空白はバッファから破棄されます。

デバッガーを使用してコードをステップ実行し、変数をチェックして検証します。

于 2012-11-19T12:07:11.207 に答える
0

getcharはを返す必要がありintます。理由は以下の通りです

getchar reads characters from the program's standard input 
and returns an int value suitable for storing into a char. 
The int value is for one reason only: not only does getchar 
return all possible character values, but it also returns an 
extra value to indicate that end-of-input has been seen. 
The range of a char might not be enough to hold this extra value, 
so the int has to be used.

したがって、基本的にはコード内でに変更char cする必要がありますint c

于 2012-11-19T12:07:04.430 に答える