char *ptr=(char*)calloc(n,sizeof(int));
上記を使用して、char配列にメモリを割り当てることができます。しかし、それを文字単位で読み取るのは必須? How to read and access it using
の %s` ですか、つまり、文字列フォーマット指定子ですか?
char *ptr=(char*)calloc(n,sizeof(int));
上記を使用して、char配列にメモリを割り当てることができます。しかし、それを文字単位で読み取るのは必須? How to read and access it using
の %s` ですか、つまり、文字列フォーマット指定子ですか?
文字単位で読み取ることは必須ではなく、正確に使用%s
するとバッファ オーバーランの影響を受けやすくなります。読み込まれる最大文字数を、入力されるバッファーのバイト数よりも 1 少ない数に指定すると、バッファー オーバーランを防ぐことができます。たとえば"%10s"
、最大 10 文字を読み取り、ヌル終了文字を割り当てるため、ターゲット バッファーには少なくとも 11 バイトが必要です。
ただし、コードが示唆しているようにn
、コンパイル時に不明であるため%s
、動的な幅を明示的に使用することはできません。ただし、フォーマット指定子を構築することは可能です (フォーマット指定子は文字列リテラルである必要はありません)。
char fmt[32];
sprintf(fmt, "%%%ds", n - 1); /* If 'n == 10' then 'fmt == %9s' */
if (1 == scanf(fmt, ptr))
{
printf("[%s]\n", ptr);
}
代替案は次のfgets()
とおりです。
if (fgets(ptr, n, stdin))
{
}
ただし、動作はわずかに異なります。
fgets()
入力を終了するために空白を使用します。fgets()
改行文字に遭遇した場合、それを保存します。calloc()
(ormalloc()
またはrealloc()
) の戻り値のキャストは不要であり (「 malloc の結果をキャストしますか?」をint[n]
参照)、スペースを割り当てているが、文字配列を意図しているため、投稿されたものは混乱を招きます。その代わり:
char* ptr = calloc(n, 1); /* 1 == sizeof(char) */
ptr
また、 null で終了する文字列がによって提供される初期化に読み込まれている場合calloc()
は不要なので、次のようにするmalloc()
だけで十分です。
char* ptr = malloc(n, 1);
そして、あなたがd、d、またはdするfree()
ものは何でも覚えておいてください。malloc()
calloc()
realloc()
はい、使用してそのような配列を読み取ることができますが%s
、読み取ろうとするものに十分なメモリが割り当てられていることを確認してください (終端のゼロ文字を忘れないでください!)。