Вы получаете это поведение из-за конечного \n
во входном формате. Он ищет пустое пространство и не знает, когда он закончил сканирование пробела, пока не встретит небелый пробел. Не помещайте конечное пробел в свои строки scanf()
-family, если вы действительно не знаете, что делаете, или на самом деле не имеете дело с пользовательским вводом (вход поступает из программы или файла или строки).
Обратите внимание, что ваш код должен проверять возвращаемое значение от scanf()
; он полностью войдет в бесконечный цикл, если встретится с EOF (или, действительно, если он встретит нечисловой, небелый пробел). Кроме того, при указании такой новой строки не применяется одно число на строку ввода. Пользователь может весело напечатать 1 2 3 4 5 6 7 8 9 0
на одной строке, и ваш код будет равномерно циклически 9 раз обходить цикл, прежде чем застревать.
Вы также можете обойти проблемы с помощью fgets()
(или POSIX getline()
), чтобы прочитать строку ввода, а затем использовать sscanf()
для преобразования считанных данных в ряд. Обратите внимание, что конечная новая строка безвредна.
Почему вы положили, что '\ n' в строка формата 'scanf'? Какова была твоя причина для этого? – AnT
Проблема возникла раньше, но мне было трудно найти подходящий дубликат. [Выход из цикла while в EOF с помощью scanf в C] (http://stackoverflow.com/questions/17220158/exiting-a-while-loop-at-eof-using-scanf-in-c/) имеет тот же базовый проблема, строка формата с передним и конечным пробелами вокруг числового преобразования). Я уверен, что это не единственный кандидат; Я не уверен, что это лучший кандидат. –