GDBを使用して、この操作を実行しようとすると、セグメンテーション違反が発生することがわかりました。
strcat(string,¤tChar);
文字列が次のように初期化されている場合
char * string = "";
そしてcurrentCharは
char currentChar = 'B';
なぜこれがセグメンテーション違反につながるのですか?
Strcatをこれに使用できない場合、他にどのように文字を文字列に連結できますか?
¤tChar
は文字列ではないため、\0
文字で終了しません。 B
をchar *currentChar = 'B';
として定義する必要があります。また、 http://www.cplusplus.com/reference/clibrary/cstring/strcatstring
には、結果の文字列(この場合は2バイト)を保持するのに十分なスペースが必要です。しかし、それはたった1バイトです。
または、char
を使用する場合は、(コードに応じて)次のようにすることができます。
char string[256];
...
char currentChar = 'B';
size_t cur_len = strlen(string);
if(cur_len < 254) {
string[cur_len] = currentChar;
string[cur_len+1] = '\0';
}
else
printf("Not enough space");
他の人が答えたように、&currentCharはcharまたはchar *へのポインタですが、文字列ですCではchar []またはconst char *です。
Strcatを使用してcharをstringに連結する1つの方法は、最小の文字列を作成し、それを使用してcharを文字列に変換することです。
例:
1文字と接尾辞のみの単純な文字列を作成する'\ 0';
char cToStr[2];
cToStr[1] = '\0';
あなたの質問に適用する:
char * string = "";
char currentChar = 'B';
cToStrは、文字列「B」を想定します。
cToStr[0] = currentChar;
そしてstrcatは動作します!
strcat ( string, cToStr );
strcat()は、2つの '\ 0'で終了する文字列を取ります。文字のアドレスを渡すと、ルーチンは文字に続くメモリを調べて、ターミネータを探します。
そのメモリが何を指しているのかさえわからないので、コードがメモリにアクセスするときに問題が発生することが予想されます。
それに加えて、文字列引数には文字を追加する余地がありません。そのメモリはどこに書き込まれますか?この文字列に関連付けられたメモリの終わりを超えて書き込もうとします。
最も単純な方法(効率的ではない)はsprintf
だと思います
sprintf(str, "%s%c", str, chr);
両方の文字列はnullで終了する必要があります。単一の文字はnullで終了しないため、strcatが文字の最後までの連結を停止するタイミングは未定義です。また、文字列には、元の文字列と結果の文字列の両方に対して少なくとも十分なスペースが含まれている必要があります。
これは機能します:
char string[10] = "";
char* currentChar = "B";
strcat(string, currentChar);