3

2つの文字列があり、それらを連結したいので、このコードを使用しまし char* a = "Hel"; char* b = "lo"; strcat(a,b);たが、アプリケーションを実行すると、このエラーが表示されますAccess violating writing location

4

5 に答える 5

11

どちらも (ab) 文字列リテラルです。書き込みはできません。実際には、 をchar *a = "Hel";まったく使用すべきではありません。 を使用する必要がchar const *a = "Hel";あります。この場合、コードはコンパイルさえされません。

代わりに次のようにしてみてください。

std::string a = "Hel";
std::string b = "lo";

std::string c = a + b;

strcatC++ で (正しく使用されている場合でも) せいぜい非常に疑わしいです。

于 2013-03-14T14:24:54.683 に答える
2

a変更できないリテラルを指しており、その上に文字列をstrcat追加するために宛先にスペースが必要です。srcジェリーが述べたように、使用するだけstd::stringで物事がはるかに簡単になります。使用する必要がある場合char *は、次のようにすることができます。

char str[20] ;

strcat( str, "Hel" ) ;
strcat( str, "lo" ) ;

ただし、古いCスタイルの文字列メソッドは、学習するためだけに使用している場合を除き、実際に使用するのに適したものではありません。それらを頻繁に使用する場合は、C および C++ でのセキュア コーディングに関する記事を少なくともいくつか読む必要があります: C-Style Strings .

于 2013-03-14T14:25:39.950 に答える
1

最初の宣言は、"a" を、文字 'H'、'e'、'l'、およびバイト 0 を含む 4 バイトのメモリを指すポインター変数にします。 0 バイト、次に「o」を 4 番目のバイトの後の場所に挿入します。メモリ内のその場所は書き込み先ではないため、エラーが発生します。代わりに、連結された文字列を保持するのに十分なスペースが宛先にあることを確認してください。可能であれば、strcat を単独で使用するのではなく、strncat などのより安全なものを使用してください。

于 2013-03-14T14:29:31.727 に答える
1

これらのリソースのいずれかを参照してください。

http://www.cplusplus.com/reference/cstring/strcat/

できるだけ cplusplus.com の参照ページを使用してください。

また、man ページ: man strcatUnix システムを使用している場合は、Unix コマンド ラインから。

于 2013-03-14T14:29:56.373 に答える
1

ジェリー・コフィンが言ったことを拡張しただけです。

std::string解決策は次のようになります。

char str[10];
strcpy(str,"Hel");
strcat(str,"lo");

しかしstd::string、一般的には優れています。

于 2013-03-14T14:28:01.023 に答える