2つの文字列があり、それらを連結したいので、このコードを使用しまし
char* a = "Hel";
char* b = "lo";
strcat(a,b);
たが、アプリケーションを実行すると、このエラーが表示されますAccess violating writing location
5 に答える
どちらも (a
とb
) 文字列リテラルです。書き込みはできません。実際には、 をchar *a = "Hel";
まったく使用すべきではありません。 を使用する必要がchar const *a = "Hel";
あります。この場合、コードはコンパイルさえされません。
代わりに次のようにしてみてください。
std::string a = "Hel";
std::string b = "lo";
std::string c = a + b;
strcat
C++ で (正しく使用されている場合でも) せいぜい非常に疑わしいです。
a
変更できないリテラルを指しており、その上に文字列をstrcat
追加するために宛先にスペースが必要です。src
ジェリーが述べたように、使用するだけstd::string
で物事がはるかに簡単になります。使用する必要がある場合char *
は、次のようにすることができます。
char str[20] ;
strcat( str, "Hel" ) ;
strcat( str, "lo" ) ;
ただし、古いC
スタイルの文字列メソッドは、学習するためだけに使用している場合を除き、実際に使用するのに適したものではありません。それらを頻繁に使用する場合は、C および C++ でのセキュア コーディングに関する記事を少なくともいくつか読む必要があります: C-Style Strings .
最初の宣言は、"a" を、文字 'H'、'e'、'l'、およびバイト 0 を含む 4 バイトのメモリを指すポインター変数にします。 0 バイト、次に「o」を 4 番目のバイトの後の場所に挿入します。メモリ内のその場所は書き込み先ではないため、エラーが発生します。代わりに、連結された文字列を保持するのに十分なスペースが宛先にあることを確認してください。可能であれば、strcat を単独で使用するのではなく、strncat などのより安全なものを使用してください。
これらのリソースのいずれかを参照してください。
http://www.cplusplus.com/reference/cstring/strcat/
できるだけ cplusplus.com の参照ページを使用してください。
また、man ページ: man strcat
Unix システムを使用している場合は、Unix コマンド ラインから。
ジェリー・コフィンが言ったことを拡張しただけです。
非std::string
解決策は次のようになります。
char str[10];
strcpy(str,"Hel");
strcat(str,"lo");
しかしstd::string
、一般的には優れています。