每當我在fgets之前執行scanf時,fgets指令就會被跳過。我已經在C++中討論過這個問題,我記得我必須做一些清理stdin緩衝區的指令或類似的東西。我想有一個相當於C.它是什麼?fgets指令被跳過。爲什麼?
謝謝。
每當我在fgets之前執行scanf時,fgets指令就會被跳過。我已經在C++中討論過這個問題,我記得我必須做一些清理stdin緩衝區的指令或類似的東西。我想有一個相當於C.它是什麼?fgets指令被跳過。爲什麼?
謝謝。
我敢打賭,這是因爲\ n卡在輸入流中。
請參見下面的一個問題:
I am not able to flush stdin.
How do I go about Flushing STDIN here?
scanf() causing infinite loop
P.S. fgets()
是一個函數,而不是一個指令。
的fgets()
函數調用scanf()
以下是可能 沒有得到跳過。它是可能是 立即返回在輸入流中找到一個換行符。
調用scanf()
fgets()
之前幾乎總是導致scanf()
離開輸入流,這正是fgets()
是尋找出在未使用換行符('\n'
)。
爲了混合使用scanf()
和fgets()
,您需要從輸入流中刪除調用scanf()
時留下的換行符。衝廁標準輸入(包括換行)
一個解決方案是沿着以下線的東西:
int c;
/* discard all characters up to and including newline */
while ((c = getchar()) != '\n' && c != EOF);
1 - 這是很難肯定沒有看到實際的代碼。
或者,如Jerry Coffin建議在下面他的評論,你可以使用scanf("%*[^\n]");
。 "%*[^\n]"
指令指示scanf()
匹配非換行符的內容並禁止分配轉換結果。
/* match up to newline */
scanf("%*[^\n]");
/* discard the newline */
scanf("%*c");
從http://c-faq.com/stdio/gets_flush1.html:
初始
scanf()
與「%*[^\n]」
要麼什麼都吃,直到但不包括新行,或失敗。後續的「%*c」
(或普通的舊的getchar()
)將消耗換行符,如果有的話。最後一個「if」也很重要:也許用戶發信號通知EOF。在這種情況下,
getchar()
或scanf("%*c")
可能 - 這個決定留給編寫編譯器的人 - 要麼立即返回EOF,要麼返回給用戶以獲取更多輸入。如果執行者選擇後者,用戶可能需要額外一次點擊「結束這件事」(^ D,^ Z,鼠標按鈕,前面板開關或其他)。這很煩人,如果沒有別的。
或者,如Chris Dodd建議在下面他的評論,你可以使用scanf("%*[^\n]%*1[\n]");
。 "%*[^\n]%*1[\n]"
指令指示scanf()
匹配不是換行符的內容,然後匹配一個換行符並禁止分配轉換結果。
/* match and discard all characters up to and including newline */
scanf("%*[^\n]%*1[\n]");
您可以通過以下方法更輕鬆地刷新輸入緩衝區(即,放棄,直到換行):'scanf(「%* [^ \ n]」);' – 2010-05-25 18:40:34
您可以使用scanf刷新幷包含換行符( 「%* [^ \ n]的%* 1 [\ n]的」)' – 2010-05-26 05:23:59
代碼,請..? – 2010-05-25 17:46:04
您可能會發現使用'fgets'來處理所有輸入更容易,然後在想要解析行中的值時使用'sscanf'。 – 2010-05-25 17:50:07
@Tim Post:我認爲這對於大多數用戶來說是如此的狹隘,沒有發現它是必要的。我認爲這個問題很詳細。 – nunos 2010-05-25 17:59:41