-1

ユーザーからの入力を読み取る必要があります。ユーザーが入力する行数や 1 行あたりの文字数がわからないため、配列を使用できません。ユーザーが空行を入力すると、入力が完了します。

私の質問は、配列を使用せずにこれを行う方法です。このコードを使用してみましたが、実行時にクラッシュします。

char *line = "";
gets(line);

これが機能しないのはなぜですか?また、配列を使用せずに入力を読み取るにはどうすればよいですか?

ティア

4

1 に答える 1

4

空の文字列を格納するのに十分なメモリしか指していないため、これは機能しませんline。また、文字列リテラルは実行時に変更できないため、通常、そのメモリは変更できません。

次のように、実際のバッファが必要です。

char line[128];

回避するのが最善であることに注意してくださいgets()。バッファオーバーランから保護されないため、常に危険になります。

fgets()代わりに使用してください:

if( fgets(line, sizeof line, stdin) != NULL)
{
  printf("got some input!\n");
}

[]何らかの理由でこれを「配列なし」で行いたいと言いますが、これはちょっと難しいです.Cの「バッファ」はほとんど配列であるためです.構文の使用を避けたい場合は 、を使用する代わりにメモリを動的に割り当てますmalloc()

次に、上記のように使用することはできませんsizeof。ポインターのサイズに評価されます。次に必要なもの:

const size_t buffer_size = 128;
char *line;

if((line = malloc(buffer_size)) != NULL)
{
    if(fgets(line, buffer_size, stdin) != NULL)
    {
       /* use the data we just read in */
    }
    free(line);  /* discard the buffer so we don't leak memory. */
}
于 2013-04-29T09:49:13.580 に答える