Шаг за шагом
Рекомендую не экономить на проверке ошибок. Предположим, что пользовательский ввод может быть неожиданным.
, где каждая строка входного кода начинается с оператора
Очень похоже на код OP
int ic = getchar();
if (ic == '+' || ic == '-' || ic == '*' || ic == '/' || ic == '=' || ic == 'C' ||ic == 'Q'){
op = (char) ic;
} else (ic == EOF) {
break; //EOF
} else {
fprintf(stderr, "Unexpected input %d\n", ic);
break;
}
и затем содержит потенциальные пробелы,
Используйте isspace()
для проверки пробелов.
while (isspace( (ic = getchar()) )) {
;
}
unget(ic, stdin); // ic is not a white-space - put it baack
число,
Обязательно проверьте scanf()
возвращаемое значение. Ключевым атрибутом около "%f"
является то, что он занимает первые пробелы, включая '\n'
. Чтобы обнаружить '\n'
перед числом, был полезен предыдущий цикл isspace()
. Теперь код знает, что первый символ, который он должен прочитать, это , а не любой пробел.
float f;
int cnt = scanf("%f", &f);
if (cnt != 1) {
fprintf(stderr, "Unexpected FP input\n");
break;
}
больше потенциальных пробелов и разрыв строки.
Помните, что '\n'
также является пробелом.
while ((ic = getchar()) != '\n' && isspace(ic)) {
;
}
if (ic != '\n') {
fprintf(stderr, "Unexpected trailing text %d\n", ic);
break;
}
// Success
Когда код не достигает успеха, код должен использовать весь ввод до '\n'
или EOF
, прежде чем пытаться проанализировать новую строку текста.