2013-03-21 73 views
1

我一直在搜索這個問題幾個小時,至今我還沒有看到任何提及它。調用fgets()兩次導致第二次調用不完成

int getInt() 
{ 
    char* rawin = (char*)malloc(100); 
    printf("How big should the secret code be?\n(Input number of elements):\n"); 

    while(fgets(rawin, 100, stdin) != NULL) 
    { 
     if (sscanf(rawin,"%d") == 1) 
     { 
      break; 
     } 
     printf("Numbers only please.\n"); 
    } 
    int in = atoi(rawin); 
    free(rawin); 
    return in; 
} 

如果我調用此函數兩次,我叫哪一個首先能正常工作,但第二個行爲異常。程序的行爲就像在fgets上無限循環一樣,而不是進入while循環。 fgets的第二個調用永遠不會完成,所以永遠不會返回任何東西。調試時,在「while(fgets ...)」之後的任何位置放置斷點,包括循環之後,永遠不會到達。我試圖在標準輸入的結尾附加「\ n」,「\ 0」和「\ n \ 0」 ,它什麼都沒做,我試着通過讀出每個不是'\ n'或\ 0'的字符來試圖'沖洗'stdin,這也沒有任何作用。

編輯:澄清,'if 「語句是一個佔位符

+0

「for」代表什麼? – 2013-03-21 13:18:38

+0

您確定有足夠的輸入可以被第二輪循環讀取嗎?如果'stdin'上的緩衝區爲空,'fgets'將會被阻塞。輸入來自哪裏?如果你的第一次迭代從來沒有你的break條件,那麼第一個while循環將被讀取直到'EOF',第二個循環將無限期地阻塞,除非任何發送輸入決定恢復管道併發送更多數據。 – 2013-03-21 13:19:29

+0

@HalimQarroum:這應該是一個佔位符。將解決。 – CybeatB 2013-03-21 13:20:43

回答

2

您需要存儲數據某處:

if (sscanf(rawin,"%d") == 1) 

也就是說,你sscanf()需要第三個參數:一個指向整數要存儲此轉換的結果是:

int in; 
if (sscanf(rawin,"%d",&in) == 1) 

此後您不需要撥打atoi()


作爲一個方面說明,在您的示例中不需要動態分配內存。一個簡單的數組就足夠了:

char rawin[100]; 
+1

它工作。謝謝。 – CybeatB 2013-03-21 13:43:17

+0

@CybeatB很高興能幫到你。下一次包括**所有**的代碼,或者至少是再現錯誤的最小量。目前尚不清楚發生了什麼事情,直到您從您之前的帖子中刪除了迷惑。 – chrisaycock 2013-03-21 13:44:57

-3

嘗試使標準輸入非阻塞

#include <unistd.h> 
#include <fcntl.h> 

fcntl(0, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); 

或可選擇地使用非阻塞recv,而不是與fgets的:。

#include <sys/socket.h> 

while(recv(0, inputString, 100, MSG_DONTWAIT) > 0) 
相關問題