while (scanf ("% d", & n)) {...} не завершается при нажатии Ctrl + D в Linux - PullRequest
0 голосов
/ 29 апреля 2018

Если использовать этот код для чтения числа int, когда я нажимаю Ctrl + D, эта программа не завершается.

while( scanf("%d", &n) ) { ... }

Но если я воспользуюсь этим, он выйдет.

while( scanf("%d", &n) == 1 ) { ... }

ОС, в которой я тестирую этот код, - Linux, а компилятор - g ++ 7.3.1.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

После первого чтения scanf извлекает содержимое буфера. Вот почему вы получаете бесконечный цикл. Тогда не имеет значения, что вы печатаете.

0 голосов
/ 29 апреля 2018

Первый код, который вы написали:

while( scanf("%d", &n) ) { ... }

будет работать нормально , если scanf вернет true для успеха и false для сбоя. Но это не то, что scanf возвращает.

scanf фактически возвращает количество успешно сопоставленных элементов. Или возвращает 0, если ни один не был найден. Или (и это ключевой момент) возвращает отрицательное значение EOF (обычно -1), если достигнут конец файла, например, когда вы набрали control-D.

Первый код, который вы написали, зацикливается, пока scanf возвращает ненулевое значение. Вот почему это зациклено навсегда.

Второй код, который вы написали:

while( scanf("%d", &n) == 1 ) { ... }

зацикливается до тех пор, пока scanf успешно соответствует одному пункту, который он попросил вас. Это правильный способ сделать это, и именно поэтому это сработало.

...