C - printf и scanf - Как мне прекратить ввод? - PullRequest
2 голосов
/ 30 августа 2010

Я работаю над простым приложением, написанным на C. Я работаю в среде Unix.

Мое приложение выполняет несколько простых операций ввода-вывода.Я использую printf, чтобы запросить у пользователя какой-то ввод, а затем использую scanf, чтобы получить этот ввод.

Проблема в том, что я не знаю, как сообщить своему приложению, что я готов продолжить после ввода значения,Ввод 'enter' обеспечивает новую строку '\ n', которая имеет смысл.Control-d позволяет scanf захватывать мой ввод, но, похоже, игнорирует любые последующие инструкции scanf.

Может ли кто-нибудь мне помочь?

printf("Enter name\n");
scanf("%s",input);
printf("%s",input);

printf("enter more junk\n")
scanf("%s",morestuff); /* cntrl+d skips this*/

Ответы [ 2 ]

4 голосов
/ 30 августа 2010

Проверьте возвращаемое значение от scanf(). Как только он получил EOF (в результате ввода control-D ), он будет каждый раз завершаться ошибкой, пока вы не очистите ошибку.

Будьте осторожны с использованием scanf(); Я нахожу это слишком сложным для использования в реальном мире, потому что он не дает мне контроль над обработкой ошибок, который, я думаю, мне нужен. Я рекомендую использовать fgets() или эквивалент для чтения строк данных, а затем использовать sscanf() - гораздо более цивилизованную функцию - для анализа данных.

См. Также свободно связанный вопрос: SO 3591642 .

0 голосов
/ 30 августа 2010

[РЕДАКТИРОВАТЬ: Этот ответ неверен, как я уже говорил ниже, я тоже учусь]

Вы пробовали CTRL-Z?

Это отправляет EOF на scanf, который, согласно его man-странице, должен заставить scanf перейти к следующему полю.Поскольку вы ввели только строку в качестве формата ввода, это должно прекратить сканирование.

Я не могу проверить это прямо сейчас, но вы можете сделать это.

Страница Manздесь:

http://www.slac.stanford.edu/comp/unix/package/rtems/doc/html/libc/libc.info.scanf.html

...