2012-09-09 13 views
1

我使用fgets()來獲取用戶輸入,然後使用sscanf()將它解析爲一個double。這是我的示例代碼:fgets()越過,如何清除用戶輸入?

int menuItem = 0; 
char input[3]; 
printf("Enter valid menu item"); //values are 1, 2, 3, 4, 5, and -1 
fgets(input, sizeof input, stdin); 
sscanf(input, "%d", &menuItem); 

如果用戶輸入3位數字(無效的輸入,我要相應地處理它)時出現錯誤時,它通過自動地將所述第三位數字作爲跳過我的下一個與fgets()下一個輸入。例如,如果用戶inters 123,它現在將跳過下一個fgets並使用值3作爲輸入。我怎樣才能清除這個,或者最多隻能讀取1位數字(但仍然能夠處理-1)。

回答

3

爲什麼不讓你的輸入數組變大?就像50個字節......如果用戶輸入了很多,他們是白癡,並且應該有奇怪的行爲=)

這當然不雅觀,但從它的角度來看,您可能沒有在這裏寫出工業強度的代碼。你只是想修復一個愚蠢的錯誤,這是最簡單的解決方案。

[編輯]

如果你是困惑,爲什麼我提出這一點。你的輸入數組只有足夠大的空間來存放2個值,加上一個空終止符。所以顯然,你想它足夠大,你可以確保用戶輸入一個單一的選擇,而不是兩個選擇

+0

不錯的想法 - 我想你是正確的,反正輸入那麼多數字是一個難得的機會。我想我很可能會按照你的建議去做,但出於好奇,我會如何處理這樣的錯誤呢?也就是說,我輸入[50],然後輸入80個字符。我需要做些什麼才能從緩衝區中清除那些額外的內容,以便它們不會自動放入下一個fgets()中? –

+0

由於'fgets'將換行符視爲有效,因此可以在字符串中使用換行符。因此,您應該始終爲您期望的角色留出足夠的空間,再加上一個換行符,再加上一個NULL結束符。一旦你有了自己的價值,搜索'\ n'。如果你沒有找到它,請再次調用fgets(並重復)。只有在讀取了最大字符數的情況下,才應該這樣做。這可能會在特殊情況下(例如Ctrl-D)或其他早期EOF(如果讀取文件或管道)導致問題。它還需要特別的關注,因爲換行符在操作系統中各不相同。 – paddy

2

你的輸入緩衝區允許1位數,1個換行符和1個終端空'\0',這真的不是足夠大。

假設用戶輸入100後跟一個換行符。第一次撥打fgets()將讀取2位數字(10),然後第二個電話將讀取第三位數字和換行符;那麼下一個呼叫將等待下一個輸入。

只需將緩衝區大小增加到更明智的位置即可。對於我編寫的很多程序,我使用的緩衝區大小爲4096. POSIX標準將_POSIX2_LINE_MAX設置爲2048.如果您不滿意,只需使用方便的數字(如64或128)即可;你不會犯太多錯誤。

你的技術與fgets()sscanf()絕對是更好的方向去,但你應該檢查sscanf()解析正確的數值。 fgets()加上sscanf()的好處之一是,您可以更好地報告用戶輸入的行中錯誤的內容;如果您直接使用fscanf()scanf(),則此操作要簡單得多。