簡體   English   中英

為什么這個fgets()循環永遠不會結束?

[英]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信號。 示例ABCEnter現在是一個空緩沖區<Ctrl>+<Z>Enter

如果所有輸入緩沖區都准備就緒,其中有數據,則將<Ctrl>+<Z>讀取為<Ctrl>+<Z> (ASCII 26)。

“退出”的想法有其優點,但用戶仍然可以輸入<Ctrl>+<Z> Enter 代碼應該已經准備好了。 (發布的“退出”答案會這樣做。)我建議避免使用魔術詞-除非其“ relinquo codicem”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM