char *str;
printf("Enter string:\n");
scanf("%s",str);
OUTPUT: runtime-check failure#3 str が初期化されずに使用されている
配列を割り当てて、それを読み取ります。
char str[100];
if (scanf("%99s", str) != 1)
...error...
または、ポインターが必要な場合は、次のようにします。
char data[100];
char *str = data;
if (scanf("%99s", str) != 1)
...error...
バッファ オーバーフローを防ぐために長さを使用することに注意してください。et alに指定された長さは、全体の長さよりも 1 小さいことに注意してくださいscanf()
(これは昔からの先例に基づく奇妙さです。ほとんどのコードには、指定された長さにヌル バイトが含まれていますfgets()
。たとえば、 を参照してください)。
%s
先頭の空白をスキップして、空白以外の文字の後の最初の空白で停止することに注意してください。特に、入力ストリームに改行を残し、次の入力操作が読み取れるようにします。入力の行全体が必要な場合は、raw ではなくfgets()
andを使用する必要があります。実際、合理的なエラー報告がはるかに簡単になるという理由だけで、 orではなくandを使用する必要があります。sscanf()
scanf()
fgets()
sscanf()
scanf()
fscanf()
初期化しないと未定義の動作になります。メモリ位置にデータを読み込んでいる初期化されていないポインタがあり、最終的に問題が発生する可能性があります。ポインターとして宣言str
しましたが、指す有効な場所を指定していません。最初は、書き込み可能なメモリアドレスである場合とそうでない場合があるランダムな値が含まれています。char *str; にメモリを割り当ててみてください。
char *str = malloc(sizeof(char)*100);
char *str
str
型へのポインタとして宣言しますchar
。scanf("%s",str)
入力された文字列からのみ読み取りE
ます。