ユーザーからの入力を読み取る必要があります。ユーザーが入力する行数や 1 行あたりの文字数がわからないため、配列を使用できません。ユーザーが空行を入力すると、入力が完了します。
私の質問は、配列を使用せずにこれを行う方法です。このコードを使用してみましたが、実行時にクラッシュします。
char *line = "";
gets(line);
これが機能しないのはなぜですか?また、配列を使用せずに入力を読み取るにはどうすればよいですか?
ティア
ユーザーからの入力を読み取る必要があります。ユーザーが入力する行数や 1 行あたりの文字数がわからないため、配列を使用できません。ユーザーが空行を入力すると、入力が完了します。
私の質問は、配列を使用せずにこれを行う方法です。このコードを使用してみましたが、実行時にクラッシュします。
char *line = "";
gets(line);
これが機能しないのはなぜですか?また、配列を使用せずに入力を読み取るにはどうすればよいですか?
ティア
空の文字列を格納するのに十分なメモリしか指していないため、これは機能しません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. */
}