Проблема пространства сканирования в Objective-C - PullRequest
0 голосов
/ 03 мая 2010

Я изучаю цель-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;
        }
    }

Когда пользователь вводит, например, «E 10», он выходит из цикла, но также выводит «Вы не ввели действительный оператор». Когда я изменяю код на:

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

Внезапно эта последняя строка не печатается. Что это за пробел до% c, который исправляет это?

1 Ответ

2 голосов
/ 03 мая 2010

Символы пробела в строке формата позволяют scanf() читать и игнорировать любые пробельные символы до следующего непробельного символа. В вашем случае это учитывает символы новой строки, оставшиеся от предыдущего ввода.

Что касается случая /, отступ вводит вас в заблуждение - операторы в ветви if неверны. Если вы хотите, чтобы там было несколько операторов, вам нужно поместить их в один блок с помощью фигурных скобок:

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

Обратите внимание, что фигурные скобки вокруг ветви else здесь не нужны (она содержит только один оператор), но помогают удобочитаемости.

...