-1

私は単純な C プログラムを持っています。これはループしてユーザーから不特定の数を取得します (一種の CAS です)。私は複数の言語でプログラムに取り組んでおり、C++ バージョンは完全に機能しますが、プログラムが別のユーザー操作を要求すると、C バージョンはループの最後で停止し、ユーザーは操作を 2 回入力する必要があります。プログラムの動作は次のとおりです。

操作を入力します
4+2
6
6 +2 // ユーザーは前の回答に 2 を追加します
8 +x // ユーザーはこのように無期限に追加を続けることができます

代わりに、次のようになります。

操作を入力してください
4+2
6 +2
// ユーザーがもう一度「+2」を入力するまで何も起こりません
+2
8 +x
+x
[8+x の合計]
など。

私は当初、この一時停止は、プログラムがループの開始時に 1 回、ループの最後に 2 回、ユーザー入力を求めることが原因であると考えていました。&num1,&op,&num2プログラムが取得する入力の種類 (または)を決定するために、ループに反復カウンターを配置します&op,&num2。何らかの理由で、違いはありませんでした。コードの関連部分は次のとおりです。

int opnubmer;
opnumber = 0;

printf("Enter an operation\n");
    while(op != '=')
    {
        if (opnumber == 0)
        {
            scanf("%d%c%d",&num1,&op,&num2);
        }
        else if (opnumber != 0)
        {
            scanf("%s%d",&op,&num2);
        }
        switch(op)
        {
            case '+':
                num2 += num1;
                break;

            case '-':
                num2 -= num1;
                break;

            case '*':
                num2 *= num1;
                break;

            case '/':
                num2 /= num1;
                break;

            default:
                printf("%s%c%s", "Unknown op: ", op, "\n");
                exit(1);
        }

        printf("Solution: ");
        printf("%d",num2);

        opnumber++;
        num1=num2;
   }

誰でも私を助けることができますか?

4

2 に答える 2

2

を読む代わりにscanf使用した2回目の呼び出しでタイプミスをしたようです。%s%cop

さらに、scanf入力の読み取りに使用する場合は、空白に十分注意する必要があります。末尾の空白(改行を含む)は入力ストリームに残されるため、次に入力ストリームから読み取るときに、空白が最初に表示されます。

を使用する代わりに、をscanf使用fgetsして一度に1行ずつ入力をバッファに読み込み、そのバッファから必要なものを解析します。例えば。:

char line[256];
fgets(line, sizeof(line), stdin);
sscanf(line, "%d%c%d", &num1, &op, &num2);
于 2013-03-08T16:21:34.583 に答える
0

最初の繰り返しではない場合、プログラムstringを変更して修正したとしても%c、シーケンスではなく文字と数字のみを期待している場合でも、それはまったく問題なく動作しますnumber character number

于 2013-03-08T16:24:52.087 に答える