Когда я впервые написал этот ответ, программа main()
не была предоставлена. Теперь, когда это предусмотрено, основная проблема заключается в том, что scanf()
оставляет новую строку во входном буфере . Когда основная программа читает r
(или R
), новая строка после нее остается в буфере. Код в ReadText()
немедленно читает этот символ новой строки, и ничего более.
Добавление пробела в " %c"
в ReadText()
означает, что все пробелы, табуляции и новые строки будут прочитаны при обработке пробела, и только когда будет введено что-то, что не является пробелом, ввод прекращается. Для вашего кода использование только "%c"
является правильным и необходимым (если вы не решите использовать вместо него getchar()
). Вы должны также обращаться с EOF; в ReadText()
вы должны проверить:
if (scanf("%c", &userInput) != 1)
break;
Лучшее исправление, вероятно, заключается в использовании такой функции, как:
static void gobble(void)
{
int c;
while ((c = getchar()) != EOF && c != '\n')
;
}
и вызовите его через main()
после scanf()
, чтобы прочитать символ команды:
printf («Введите команду (C, R, P или Q):»);
if (scanf ("% c", & command)! = 1)
вернуть 0; // EOF наиболее вероятно
проглатывают (); * +1027 *
Здесь " %c"
(в main()
) разумно. Это не подходит в ReadText()
.
Помните: scanf()
, вероятно, самая сложная функция, которую можно действительно хорошо использовать в стандартном C - она мучительно сложна и неуловима, и на любой конкретный вызов часто влияют предыдущие операции ввода, особенно предыдущие вызовы scanf()
. Восстановление после ошибки на входе также довольно сложно, если вы не используете такую функцию, как gobble()
, чтобы удалить остатки непрочитанного остатка на линии - но диагностика того, что пошло не так, тоже трудна. Часто лучше прочитать строку с помощью fgets()
(или POSIX getline()
), а затем отсканировать ее с помощью sscanf()
, что позволяет (а) делать несколько попыток анализа одних и тех же данных, а (б) позволяет сообщать о всей неисправной строке, а не о том, какие фрагменты остались после того, как scanf()
прочитал некоторые, но не всю строку.