0

コードのこの部分をどのように実装できるかについて、少し混乱しています。

ユーザーから最大 256 文字の文字列を読み取る必要があります。ユーザーが入力する場合は、文字列にスペースと改行も含める必要があります。ユーザー"."が自分で入力すると、入力が完了したことがプログラムに通知されます。入力が完了すると、プログラムはまったく同じ文字列を同じ間隔と改行で吐き出します。

例えば:

Please enter a string: This is just a test.
The input has not ended yet.
It will end when the user enters just a period.
.

プログラムは次を返します。

This is just a test.
The input has not ended yet.
It will end when the user enters just a period.

これまでのところ、これを行う唯一の方法は を使用するfgets()ことですが、".". おそらく、継続的にチェックするwhileループを考えていましたか?

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

1

アイデアは、新しいデータが入ってくるたびに再割り当てするバッファを使用し、そのサイズを追跡することです:

char* data = NULL;
size_t size = 0;

あなたの仮定は正しいです。これにはループが必要です。このようなもの:

int end = 0;
while (!end) {
    char buf[512];
    if (fgets(buf, sizeof buf, stdin) == NULL) {
        // an error occured, you probably should abort the program
    }
}

バッファが実際にデータ入力を終了したいトークンであるかどうかを確認する必要があります:

if (strcmp(buf, ".\n") == 0) {
    // end loop
}

トークンが見つからない場合は、データ バッファーを再割り当てし、読み取った文字列の長さだけ長くする必要があります。

size_t len = strlen(buf);
char* tmp = realloc(data, size + len + 1);   // ... plus the null terminator
if (tmp == NULL) {
    // handle your allocation failure
}

...そして最後に新しいコンテンツをコピーします:

data = tmp;
memcpy(data + size, buf, len);
size += len;
data[size] = '\0';                           // don't forget the null terminator

完了したら、出力してクリーンアップします。

printf("%s", data);
free(data);

空欄を埋めてアセンブルすれば、要求どおりに動作する安全なプログラムが完成します。

于 2012-09-15T18:25:36.227 に答える