2010-08-30 95 views
2

我正在用C編寫一個簡單的應用程序。我正在Unix環境中工作。C - printf和scanf - 如何終止輸入?

我的應用程序正在做一些簡單的I/O。我使用printf來提示用戶輸入一些內容,然後使用scanf來獲取輸入。

問題是,我不知道如何告訴我的應用程序,我準備在輸入值後繼續。鍵入'輸入'提供了換行符'\ 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

進入不僅增加了一個 '\ n',但也刷新緩衝區。 IO一直等到緩衝區已滿或手動刷新爲止。 – 2010-08-30 03:33:00

回答

4

檢查返回值從scanf()。一旦獲得EOF(由於您鍵入了control-D),每次都會失敗,直到您清除錯誤。

請謹慎使用scanf();我發現在真實世界中使用它非常困難,因爲它不能控制我認爲需要的錯誤處理。我建議使用fgets()或相當於讀取數據行,然後使用sscanf() - 一個更文明的函數 - 來解析數據。

另請參閱鬆散相關的問題:SO 3591642

+0

完美。謝謝..問題是scanf中的換行符。我會研究你提到的其他功能。 – Nick 2010-08-30 03:56:05

+1

當喬納森說「謹慎使用scanf()」的時候,喬納森會變得慈善。我寧願用「避免它像瘟疫一樣」:-) scanf(無字段寬度限制的%s格式)的天真使用是一個等待發生的緩衝區溢出錯誤。 – 2010-08-30 04:08:29

-1

[編輯:這個答案是不正確,因爲我下面所說,我正在學習以及]

你試過CTRL-Z?

將EOF發送到scanf,根據它的手冊頁,它應該使scanf移動到下一個字段。由於您只輸入了一個字符串作爲輸入格式,因此應該終止scanf。

我現在不能測試這個,但你可以試試看。

手冊頁是在這裏:

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

+3

在Unix上從終端發送EOF的正常默認值是Control-D;在DOS上,它是Control-Z。當然,您可以將Unix設置爲使用「stty eof^Z」來模擬DOS。但是,更通常的情況是,Control-Z用於暫停當前(前臺)進程並讓您使用shell進行操作。 – 2010-08-30 03:28:06

+1

謝謝,總是樂於學習新東西(或者在這種情況下,重新學習一些東西)。 – babbitt 2010-08-30 03:38:54