2010-08-30 3 views
2

Я работаю над простым приложением, написанным на C. Я работаю в среде Unix.C - printf и scanf - Как я могу завершить ввод?

Мое приложение выполняет некоторые простые операции ввода-вывода. Я использую 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*/ 
+0

Enter не только добавляет '\ п', но и очищает буфер. IO сидит в ожидании до тех пор, пока не будет заполнен буфер или он не будет ручным. –

ответ

4

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

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

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

+0

безупречный. Спасибо .. Проблема была символом новой строки в scanf. я рассмотрю эти другие функции, которые вы упомянули. – Nick

+1

Джонатан является благотворительным, когда говорит: «Будьте осторожны в использовании scanf()»; Вместо этого я хотел бы «избегать этого, как чума» :-) Наивное использование scanf (формат% s без ограничения ширины поля) - это ошибка переполнения буфера, ожидающая своего появления. –

-1

[EDIT: Этот ответ неверен, как я уже говорил ниже, я учусь, а]

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

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

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

Man страница находится здесь:

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

+3

Нормальным значением по умолчанию для отправки EOF с терминала в Unix является Control-D; на DOS, это Control-Z. Вы можете установить Unix для имитации DOS с помощью '' stty eof^Z' ', конечно. Однако, как правило, Control-Z используется для приостановки текущего (переднего плана) процесса и позволяет делать что-то с оболочкой. –

+1

Спасибо, всегда рады узнать что-то новое (или, в данном случае, переучиться). – babbitt

Смежные вопросы