2014-09-10 78 views
0

我想要做一個while循環,不斷要求用戶輸入,直到用戶ctrl-d退出爲止。我怎樣才能正確地做到這一點?我現在正在使用這個:雖然循環要求輸入,直到ctrl-d使用C

while (1) 
    { 
     printf("Enter host name: "); 
     fgets(user_input, 1000, stdin); 
    } 

這個工程,除了用戶必須按ctrl-c來結束程序。我希望不斷詢問用戶輸入的內容,直到他/她點擊ctrl-d。我怎樣才能做到這一點?

+1

'if(NULL == fgets(user_input,1000,stdin))break;' – BLUEPIXY 2014-09-10 16:21:13

+0

'do printf(...)while(fgets(...)!= NULL);' – WhozCraig 2014-09-10 16:23:42

+0

@WhozCraig唯一的問題與do ..同時,它不會讓您有機會在再次提示之前處理由fgets返回的數據。 – par 2014-09-10 16:25:41

回答

1

您必須測試EOF,這是CTRL-D返回的結果。

所以做到這一點:

while (fgets(...) != NULL) { 
    ... 
} 

編輯:

既然你提示,更妙的是:

for (;;) { 
    printf("enter input: "); 
    fflush(NULL); // make sure prompt is actually displayed, credit Basile Starynkevitch 
    if (fgets(input, ...) == NULL) break; 

    // handle input here 
} 
+0

我會在'fgets'之前建議'fflush(NULL);(即使'fgets'的一些實現可能會這樣做) – 2014-09-10 16:47:00

+1

好點。對於OP來說,這樣做的理由是爲了確保在程序等待輸入之前,提示的文本將其顯示在屏幕上。如果沒有結尾的換行符,輸出緩衝區可能沒有足夠的數據來打印提示。我會編輯我的答案。 – par 2014-09-10 16:52:32

+0

不應該是'fflush(stdout)'? – chux 2014-09-10 17:01:01

0

一個CTRL-d將發送的EOF(完文件)字符,它在fgets中翻譯爲空指針:

while (fgets(user_input, 1000, stdin) != NULL) { 
    // do stuff... 
} 
// no more user input 
+0

沒有「(文件結束)字符」。 – chux 2014-09-10 17:04:13

+0

如果你想要挑選,首先沒有「人物」。 – 2014-09-10 17:06:38