1
#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()より多くの入力を求め続けています。どうすればこれを修正できますか。

4

3 に答える 3

3

fgets()NULLファイルからそれ以上の行を読み取れなくなるまで、渡したバッファーへのポインター (ポインターではないことが望ましい) を返します。

もちろん、標準入力から読み取る場合は、常に別の行を待機するため、EOF を端末に明示的に送信して、ファイルの終わりを報告する必要があります。<ctrl> + <D>たとえば、 を押すと実行できます。

于 2013-09-08T08:35:01.967 に答える
0

OP が閉じられなかったため、ループは終了しませんstdin。がstdin閉じられ、すべてのデータが読み取られると、fgets()NULL が返されます。

@H2CO3 ソリューションは目標どおりですが、OP はいくつかの Windows の微妙な点を見逃している可能性があります。

A<Ctrl>+<Z>は、入力バッファが空の場合に EOF を通知し、その後に が続きEnterます。例A, B, C,のバッファEnter, .<Ctrl>+<Z>Enter

入力バッファにデータがある場合、aは(ASCII 26)<Ctrl>+<Z>として読み取られます。<Ctrl>+<Z>

「やめる」という考えにはメリットがありますが、ユーザーはまだ<Ctrl>+<Z>,に入ることができEnterます。コードはそのための準備ができている必要があります。(投稿された「終了」の回答はそれを行います。)「relinquo codecem」でない限り、魔法の言葉を避けることをお勧めします。

于 2013-09-10T19:29:47.717 に答える
0

1 つの方法は、ユーザーに特定のキーワード (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;
           }
}
于 2013-09-08T08:36:03.493 に答える