web-dev-qa-db-ja.com

strcatはcharを文字列に連結しますか?

GDBを使用して、この操作を実行しようとすると、セグメンテーション違反が発生することがわかりました。

strcat(string,&currentChar);

文字列が次のように初期化されている場合

char * string = "";

そしてcurrentCharは

char currentChar = 'B';

なぜこれがセグメンテーション違反につながるのですか?

Strcatをこれに使用できない場合、他にどのように文字を文字列に連結できますか?

10
Blackbinary

&currentCharは文字列ではないため、\0文字で終了しません。 Bchar *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");
9
Elalfer

他の人が答えたように、&currentCharcharまたはchar *へのポインタですが、文字列ですCではchar []またはconst char *です。

Strcatを使用してcharstringに連結する1つの方法は、最小の文字列を作成し、それを使用してcharを文字列に変換することです。

例:

1文字と接尾辞のみの単純な文字列を作成する'\ 0';

char cToStr[2];
cToStr[1] = '\0';

あなたの質問に適用する:

char * string = "";
char currentChar = 'B';

cToStrは、文字列「B」を想定します。

cToStr[0] = currentChar;

そしてstrcatは動作します!

strcat ( string, cToStr );
12
gagallo7

strcat()は、2つの '\ 0'で終了する文字列を取ります。文字のアドレスを渡すと、ルーチンは文字に続くメモリを調べて、ターミネータを探します。

そのメモリが何を指しているのかさえわからないので、コードがメモリにアクセスするときに問題が発生することが予想されます。

それに加えて、文字列引数には文字を追加する余地がありません。そのメモリはどこに書き込まれますか?この文字列に関連付けられたメモリの終わりを超えて書き込もうとします。

1
Jonathan Wood

最も単純な方法(効率的ではない)はsprintfだと思います

sprintf(str, "%s%c", str, chr);

1

両方の文字列はnullで終了する必要があります。単一の文字はnullで終了しないため、strcatが文字の最後までの連結を停止するタイミングは未定義です。また、文字列には、元の文字列と結果の文字列の両方に対して少なくとも十分なスペースが含まれている必要があります。

これは機能します:

char string[10] = "";
char* currentChar = "B";
strcat(string, currentChar);
0
helloworld922