@16tons addresses the most obvious issueですが、メモリに問題があります。 scanf
とstrcat
コールはbuffer overflowsに対して脆弱です。彼らは割り当てられたメモリだけに限定されません。
for(i=0;i<n;i++)
{
scanf("%s%s",name[i],sur[i]);
}
これはname[i]
とのみ、それぞれ63と14文字の文字列を保持することができますsur[i]
に入力任意の数の文字を入れしようとします。つまり、Hubert Wolfeschlegelsteinhausenbergerdorffは、"Hubert\0"
とsur[i]
が含まれ、"Wolfeschlegelst"
(NULLバイトなし)を含み、残りは問題を引き起こす隣接メモリに流出します。ヌルバイトがないため、sur[i]
を文字列として使用しようとすると、それ以降のガベージを読み込むことになります。
strcat
と同じです。
for(i=0;i<n;i++)
{
a[0]=' ';
a[1]='\0';
strcat(name[i],a);
strcat(name[i],sur[i]);
}
name[i]
が既に満杯である場合、それの最後に追加すると、隣接するメモリ上に落書きと奇妙な問題を引き起こし、そのバッファをオーバーフローします。
How many names? 3
Enter names:
Hubert Wolfeschlegelsteinhausenbergerdorff
Hubert Wolfeschlegelsteinhausenbergerdorff
Hubert Wolfeschlegelsteinhausenbergerdorff
The names are:
Hubert WolfeschlegelstWolfeschlegelstWolfeschlegelsteinhausenbergerdorff WolfeschlegelstWolfeschlegelsteinhausenbergerdorff
gerdorff WolfeschlegelstWolfeschlegelsteinhausenbergerdorff
Hubert Wolfeschlegelsteinhausenbergerdorff
これを回避するために、scanf
は、バッファサイズに制限しなければなりません。 strcat
を使用する場合、追加する文字列には新しい文字を受け入れるための十分なスペースが必要です。
name[i]
を使用して名前とフルネームの両方を保存しているので、最後のスペースを残すようにファーストネームのサイズを制限することが重要です。 sur[i]
は14文字を持ち、name[i]
は63を持つことができるので、63 - 14または49です。スペースを忘れないでください! 48.
for(i=0;i<n;i++)
{
scanf("%48s%14s",name[i],sur[i]);
}
これはscanf
は、(15を使用して)sur[i]
にせいぜい14(49なぜならヌル・バイトのバイトを使用して)name[i]
にせいぜい48個の文字を読まないことを保証します。
あなたのstrcat
は安全です。 name[i]
にスペースを受け入れるスペースがあり、最後にsur[i]
があることがわかります。 48(最大文字は既にname[i]
にあります)+ 1(スペース)+14(最大でsur[i]
)+1(ヌルバイト)= 64です。
あなたの技術はいくつかのメモリを節約できますが、それは新鮮なname
変数に連結された別々のgiven
とsurname
変数を持ってくらい安全です。次に、given
、surname
のサイズと、どれくらい大きいかを知るためのスペースを追加してください。name
scanf
の制限は、単純にバッファーのサイズです。 surname
が大きくなると、1つの変数が余分なスペースを残しておかなければならず、それらの計算をすべてやり直さなくてもよく(または、やり直すのを忘れる可能性が高い)ことを覚えておく必要はありません。あなたの特定の目的のために
、strcat
sが不要です。 printf
はそれをより安全に行うことができます。
printf("\nThe names are:\n");
for(i=0;i<n;i++)
{
printf("%s %s\n",name[i], sur[i]);
}
それは一緒にそれらを連結し、それらを印刷するよりも、ストリームに変数の束を印刷するように簡単に、安全に、かつ高速です。
あなたのコードの 'a [3] = '';'はあくまでも予言的です。 'a [0]'を使用し、 'a [1]'をNULLにしてください。 – 16tons
コンパイラの警告を有効にします(通常は '-Wall'を追加します)。彼らは 'a [3] = '''問題のようなものを捕まえます。 – Schwern