2012-04-14 171 views
1

我寫了下面的代碼:與fgets()不等待輸入

int N; 
scanf("%d", &N); 
int i; 
for (i = 0; i < N; i++) { 
    char line[LINE_MAX]; 
    if (fgets(line, LINE_MAX, stdin) != NULL) { 
    // do stuff with line here 
    printf("%c - %c\n", line[0], line[1]); 
    } 
} 

我有擁有它的行數的輸入文件,然後行的這個數字其次,我要處理。所以我讀到N的行數。在那之後,我使用fgets來讓這條線能夠處理它。

然而,fgets似乎並沒有等待標準輸入的第一次。我總是得到-的輸出,然後等待輸入。意思是,循環的第一次迭代,它不是在fgets等待標準輸入和剛打印出由-分開,我printf做兩個空字符。

這是爲什麼?我怎樣才能讓fgets每次都等待輸入?我覺得這是一個線程問題。

回答

4

作爲geekosaur表示,你沒有處理scanf留下的換行符。您可以通過修改scanf格式字符串,考慮到這一點:

scanf("%d *[^\n]", &N); 

*[^\n]說無視你整數輸入不是一個換行符之後的一切,但不要做與換行符(跳過)任何東西。

測試程序輸出:

[email protected]:~/testing$ ./test2 
3 
13 
1 - 3 
26 
2 - 6 
59 
5 - 9 
+0

但這仍然留下了新行未讀,這意味着它的()'通過以下'與fgets讀的第一件事,這通常不是什麼打算。 – geekosaur 2012-04-14 20:46:58

2

它無關線程。 scanf()正確地讀取您要求的內容;它將所有其他內容都保留爲未讀,特別是數據後面的換行符。 (您也沒有處理用戶未輸入您想要的內容的可能性。)

如果要執行面向行的輸入,請使用fgets()。不要使用scanf(),並希望系統可以神奇地直覺,你想忽略你沒有閱讀的內容。

+0

我完全忘了換行。謝謝 – darksky 2012-04-14 19:38:56

+0

由於某種原因,我創建了一個大小爲1的char數組來放置int,因此:'char Nc [1]'和'fgets(Nc,1,stdin)',但是'fgets'不會等待閱讀任何東西。該計劃剛剛存在。 – darksky 2012-04-14 19:43:44

+0

@Nayefc:你仍然可以使用scanf。看到我的答案。 – 2012-04-14 20:43:28

1

你可以只在scanf函數(之後,要fflush()的調用)是這樣的:

int N; 
scanf("%d", &N); 
fflush (stdin); 
int i; 
... (rest of code)... 

因此,從stdin緩衝區和刪除換行符GES接下來fgets()將停止詢問輸入。

+0

這麼多!由於scanf&fgets的原因,我把頭撞到牆上... – 2014-06-18 03:12:11