このコードの何が問題なのか教えてもらえますか???
char sms[] = "gr8";
strcat (sms, " & :)");
このコードの何が問題なのか教えてもらえますか???
char sms[] = "gr8";
strcat (sms, " & :)");
sms
4
サイズ1の配列です。4
また、配列はすでに占有されている最大文字数に対応できるため、配列の外側にある文字リテラルをさらに追加していg, r, 8, \0
ます。
1. ところで、なぜ正確に 4 なのですか? 回答 : 最後に null 文字があるためです。
以下に示すように配列のサイズに言及すると、コードは有効で明確に定義されています。
char sms[10] = "gr8"; //ensure that size of the array is 10
//so it can be appended few chars later.
strcat (sms, " & :)");
しかし、C++ はより良い解決策を提供します: 次のように使用std::string
します:
#include <string> //must
std::string sms = "gr8";
sms += " & :)"; //string concatenation - easy and cute!
はい、余分な文字を入れる余地はありません。sms[]
初期化された文字列を格納するのに十分なスペースのみを割り当てます。
C++ を使用すると、はるかに優れたソリューションは次のようになります。
std::string sms = "gr8";
sms += " & :)";
未割り当てメモリにデータをコピーしています。
これを行うchar sms[] = "gr8";
と、文字列の末尾に「gr8」と 0 文字を加えた 4 文字の char 配列が作成されます。
strcat
次に、配列の終わりを超えて、呼び出しで余分な文字を配列にコピーしようとします。これは、未定義の動作につながります。これは、予測できないことが起こることを意味します (プログラムがクラッシュするか、奇妙な出力が表示される可能性があります)。
これを修正するには、文字をコピーする配列がすべての文字を含むのに十分な大きさであることを確認し、最後の 0 文字を忘れないでください。
C では、配列は自動的に大きくなりません。
sms
特定の長さ (この場合は 4 - 3 文字と終端の NULL) があります。を呼び出すとstrcat
、その長さを超えてその配列に文字を追加しようとしています。
これは未定義の動作であり、プログラムが壊れます。
代わりに、両方の文字列を含むのに十分な大きさの配列を割り当てた場合は、問題ありません。
char sms[9] = "gr8";
strcat (sms, " & :)");
C++ には、(基本的に) C と同じ配列に関する制限があります。ただし、次のような配列を頻繁に処理する必要がないように、より高いレベルの機能を提供しますstd::string
。
#include <string>
// ...
std::string sms = "gr8";
sms += " & :)";
これが優れている理由は、文字列の長さを正確に事前に知る必要がないからです。C++ は、基になるメモリ内のストレージを拡張します。
文字配列のバッファ オーバーフローに続いて、どこかでクラッシュしました!
SMS バッファの長さはわずか 4 文字です。strcat は、その末尾にさらに 5 文字をコピーし、スタックを破損します。