2010-05-25 154 views
4

每當我在fgets之前執行scanf時,fgets指令就會被跳過。我已經在C++中討論過這個問題,我記得我必須做一些清理stdin緩衝區的指令或類似的東西。我想有一個相當於C.它是什麼?fgets指令被跳過。爲什麼?

謝謝。

+7

代碼,請..? – 2010-05-25 17:46:04

+1

您可能會發現使用'fgets'來處理所有輸入更容易,然後在想要解析行中的值時使用'sscanf'。 – 2010-05-25 17:50:07

+0

@Tim Post:我認爲這對於大多數用戶來說是如此的狹隘,沒有發現它是必要的。我認爲這個問題很詳細。 – nunos 2010-05-25 17:59:41

回答

3

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]"); 
+2

您可以通過以下方法更輕鬆地刷新輸入緩衝區(即,放棄,直到換行):'scanf(「%* [^ \ n]」);' – 2010-05-25 18:40:34

+1

您可以使用scanf刷新幷包含換行符( 「%* [^ \ n]的%* 1 [\ n]的」)' – 2010-05-26 05:23:59