Спасаясь от "белого пространства", убегающего в C - PullRequest
1 голос
/ 07 сентября 2010

Я действительно уверен, как объяснить этот вопрос, но я попробую.

У меня есть эта строка кода в моей программе:

scanf (" %c", &character);

Обратите внимание на пробел перед% c. Это должно помешать scanf интерпретировать последнюю клавишу ENTER как символ. Это работает, однако после этой строки и полученного в результате вывода printf программа не продолжит выполнение, пока я не предоставлю другой символ, а затем не нажму клавишу ENTER. После этого он игнорирует все функции scanf и печатает весь вывод printf при отсутствии какого-либо пользовательского ввода. Имеет ли это смысл. Я новичок в C, так что я уверен, что упускаю что-то простое, но я не смог найти никаких решений.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 08 сентября 2010

Стандартный ввод буферизован.

Ваш код не увидит буфер до тех пор, пока он (стандартный ввод) не будет очищен.
Это происходит, когда буфер заполняется или вставляется '\ n' (клавиша ввода).

Поскольку scanf () является блокирующим вызовом ввода / вывода.Приложение будет ждать ввода (бесконечно).Таким образом, код выглядит так, как будто он застопорился.

ИМХО

Вы не должны пытаться интерпретировать то, что произошло позади вас в предыдущих частях кода.Это соединит ваш код с другим входом, который вы можете не контролировать.Ваш ввод должен читать все, что нужно, и не более.

Например: если вы просите пользователя ввести символ, нажмите Enter.Вы должны удалить символ, а затем войти из потока ввода.Вы не должны ожидать, что следующий пользователь потока уберет за вас (или компенсирует ваш код).

printf("Enter (Y/N)\n");
scanf("%c", &character);
scanf("%*[^\n]"); // Ignore everything to the end of line.
                   // Assuming you have told the user you will ignore
                   // extraneous characters. The next input should now
                   // expect only what they need.
0 голосов
/ 08 сентября 2010

В вашем предыдущем scanf вызове используйте что-то вроде scanf("%c\n", &character);, чтобы перевести новую строку при вводе. Обычно это менее подвержено ошибкам, чем ожидание обработки в следующий раз, когда вам понадобится ввод.

0 голосов
/ 08 сентября 2010

Попробуйте это:

scanf ("\n%c", &character);

Он должен «потреблять» символ \n в буфере, а затем ждать нового символа.

...