[英]Why does this fgets() loop never end?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1024
int main ()
{
char buffer[BUF_SIZE];
int contentSize = 1;
char* content = (char*)malloc(sizeof(char) * BUF_SIZE);
content[0] = '\0';
while(fgets(buffer, BUF_SIZE, stdin))
{
contentSize = contentSize + strlen(buffer);
content = (char*)realloc(content, contentSize);
strcat(content, buffer);
}
return 0;
}
即時通訊試圖讀取用戶輸入的所有內容(即使是空格字符),我也很接近使其正常工作,但循環永無止境。 fgets()
一直在要求更多輸入,請問如何解決。
fgets()
將指針傳遞給您傳遞給它的緩沖區(最好不是NULL
指針),直到它不能從文件中讀取更多行為止。
當然,如果從標准輸入中讀取數據,它將始終等待另一行,因此您必須向終端顯式發送EOF,以便它報告文件結束。 例如,您可以通過按<ctrl> + <D>
來完成此操作。
一種方法是讓用戶輸入某些關鍵字(例如quit或quit()),然后退出while循環。
while(fgets(buffer, BUF_SIZE, stdin)) {
contentSize = contentSize + strlen(buffer);
content = (char*)realloc(content, contentSize);
strcat(content, buffer);
if (strncmp(buffer, "quit", strlen("quit")) == 0) {
break;
}
}
循環永遠不會結束,因為OP沒有關閉stdin
。 關閉stdin
並讀取所有數據后, fgets()
將返回NULL。
@ H2CO3解決方案已達到目標,但OP可能錯過了一些Windows的技巧。
如果輸入緩沖區為空,然后按Enter
,則<Ctrl>+<Z>
將發出EOF信號。 示例A
, B
, C
, Enter
, 現在是一個空緩沖區 , <Ctrl>+<Z>
, Enter
。
如果所有輸入緩沖區都准備就緒,其中有數據,則將<Ctrl>+<Z>
讀取為<Ctrl>+<Z>
(ASCII 26)。
“退出”的想法有其優點,但用戶仍然可以輸入<Ctrl>+<Z>
Enter
。 代碼應該已經准備好了。 (發布的“退出”答案會這樣做。)我建議避免使用魔術詞-除非其“ relinquo codicem”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.