0

私はObjective-Cを学んでいますが、私の人生では、なぜこれが起こっているのか理解できません。コードが次の場合にユーザーが入力した場合:

scanf("%c %lf", &operator, &number);

何らかの理由で、このコードを台無しにします。

    doQuit = 0;
    [deskCalc setAccumulator: 0];
    while (doQuit == 0) {
        NSLog(@"Please input an operation and then a number:");
        scanf("%c %lf", &operator, &number);

        switch (operator) { 
            case '+':
                [deskCalc add: number];
                NSLog (@"%lf", [deskCalc accumulator]);
                break;
            case '-':
                [deskCalc subtract: number];
                NSLog (@"%lf", [deskCalc accumulator]);
                break;
            case '*':
            case 'x':
                [deskCalc multiply: number];
                NSLog (@"%lf", [deskCalc accumulator]);
                break;
            case '/':
            if (number != 0) 
                [deskCalc divide: number];
                NSLog (@"%lf", [deskCalc accumulator]);
            else 
                NSLog(@"You can't divide by zero.");
                break; 
            case 'S':
                [deskCalc setAccumulator: number];
                NSLog (@"%lf", [deskCalc accumulator]);
                break;
            case 'E':
                doQuit = 1;
                break;
            default:
                NSLog(@"You did not enter a valid operator.");
                break;
        }
    }

ユーザーがたとえば「E10」と入力すると、ループは終了しますが、「有効な演算子を入力していません」と出力されます。コードを次のように変更すると:

scanf(" %c %lf", &operator, &number);

突然、この最後の行が印刷されません。これを修正する%cの前のスペースについてはどうですか?

4

1 に答える 1

2

フォーマット文字列scanf()の空白文字は、次の非空白文字までの空白文字を読み取って無視します。あなたの場合、これは前の入力から残っている改行文字を処理します。

ケースに関して/は、インデントが誤解を招く可能性があります-ブランチのステートメントはif正しくありません。そこに複数のステートメントが必要な場合は、中括弧を使用してそれらを 1 つのブロックに入れる必要があります。

if (number != 0) {
    [deskCalc divide: number];
    NSLog (@"%lf", [deskCalc accumulator]);
} else {
    NSLog(@"You can't divide by zero.");
}

ここでは分岐を囲む中括弧elseは必要ありませんが (ステートメントは 1 つしか含まれていません)、読みやすくなっていることに注意してください。

于 2010-05-03T04:47:47.927 に答える