2013-07-08 2 views
4

Я использовал scanf() внутри цикла while.Почему scanf застревает внутри цикла while?

while(1) 
{ 
    int input = 0; 
    scanf("%d\n", &input); 
    printf("%d\n", input); 
} 

Когда я запускаю эту программу, и я ввожу номер, printf() не показывает, что число, если я снова ввести другой номер. Зачем?

+0

Почему вы положили, что '\ n' в строка формата 'scanf'? Какова была твоя причина для этого? – AnT

+0

Проблема возникла раньше, но мне было трудно найти подходящий дубликат. [Выход из цикла while в EOF с помощью scanf в C] (http://stackoverflow.com/questions/17220158/exiting-a-while-loop-at-eof-using-scanf-in-c/) имеет тот же базовый проблема, строка формата с передним и конечным пробелами вокруг числового преобразования). Я уверен, что это не единственный кандидат; Я не уверен, что это лучший кандидат. –

ответ

5

\n в вашем scanf формате интерпретируется как «любое количество пробелов». Он сохраняет чтение пробелов (пробелы, вкладки или возврат каретки) до тех пор, пока не ударит что-то, что не является пробелом.

2

Вы получаете это поведение из-за конечного \n во входном формате. Он ищет пустое пространство и не знает, когда он закончил сканирование пробела, пока не встретит небелый пробел. Не помещайте конечное пробел в свои строки scanf() -family, если вы действительно не знаете, что делаете, или на самом деле не имеете дело с пользовательским вводом (вход поступает из программы или файла или строки).

Обратите внимание, что ваш код должен проверять возвращаемое значение от scanf(); он полностью войдет в бесконечный цикл, если встретится с EOF (или, действительно, если он встретит нечисловой, небелый пробел). Кроме того, при указании такой новой строки не применяется одно число на строку ввода. Пользователь может весело напечатать 1 2 3 4 5 6 7 8 9 0 на одной строке, и ваш код будет равномерно циклически 9 раз обходить цикл, прежде чем застревать.

Вы также можете обойти проблемы с помощью fgets() (или POSIX getline()), чтобы прочитать строку ввода, а затем использовать sscanf() для преобразования считанных данных в ряд. Обратите внимание, что конечная новая строка безвредна.

1
scanf("%d\n", &input); 

Я обычно просто идти с последующей

scanf("%d", &input); 

без "\ п"

+0

Люди, которые покидают новую строку с выхода, являются одной из неприятностей программирования здесь на SO. Если вы хотите, чтобы результат отображался своевременно, вы должны вывести новую строку, когда закончите с выходом.Это вдвойне важно для диагностического вывода; нет никакого смысла в диагностическом выходе, который не появляется до того, как программа выйдет из строя или зависает, а вывод, не законченный с помощью новой строки, может не отображаться. (Этот ответ также не имеет ничего общего с проблемой, о которой идет речь.) –

+0

спасибо за комментарий, я думал, что scanf с \ n не обязательно – aah134

+0

Кстати, я отредактировал ответ, я имел в виду, что новая строка хороша с выходом, но не в вход: D – aah134

1

Если посмотреть на ссылки на scanf вы увидите, что:

Строка формата состоит из символов пробелов (любой символ пробела в строке формата потребляет все доступные последовательные пробельные символы из входного)

Так \n будет вызывать этот эффект, если вы не хотите, чтобы это поведение просто оставить из \n:

scanf("%d", &input);