GDBを使用して、この操作を実行しようとすると、セグメンテーション違反が発生することがわかりました。
strcat(string,¤tChar);
文字列が次のように初期化されると仮定します
char * string = "";
そしてcurrentCharは
char currentChar = 'B';
なぜこれがセグメンテーション違反になるのですか?
strcatをこれに使用できない場合、他にどのように文字を文字列に連結できますか?
GDBを使用して、この操作を実行しようとすると、セグメンテーション違反が発生することがわかりました。
strcat(string,¤tChar);
文字列が次のように初期化されると仮定します
char * string = "";
そしてcurrentCharは
char currentChar = 'B';
なぜこれがセグメンテーション違反になるのですか?
strcatをこれに使用できない場合、他にどのように文字を文字列に連結できますか?
他の人が回答したように、¤tCharはcharまたはchar*へのポインターですが、C の文字列はchar[]またはconst char*です。
strcat を使用してcharをstringに連結する 1 つの方法は、最小限の文字列を作成し、それを使用して char を string に変換することです。
例:
1 文字と接尾辞'\0'のみの単純な文字列を作成します。
char cToStr[2];
cToStr[1] = '\0';
あなたの質問に適用する:
char * string = "";
char currentChar = 'B';
cToStr は文字列 "B" を想定します。
cToStr[0] = currentChar;
そしてstrcatはうまくいきます!
strcat ( string, cToStr );
¤tChar
は文字列ではないため、文字で終了しません\0
。B
として定義する必要がありますchar *currentChar = 'B';
。また、http://www.cplusplus.com/reference/clibrary/cstring/strcat string
によると、結果の文字列(この場合は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");
strcat()は、2つの'\0'で終了する文字列を取ります。文字のアドレスを渡すと、ルーチンは文字に続くメモリを調べて、ターミネータを探します。
そのメモリが何を指しているのかさえわからないので、コードがメモリにアクセスするときに問題が発生する可能性があります。
それに加えて、文字列引数には文字を追加する余地がありません。そのメモリはどこに書き込まれますか?この文字列に関連付けられているメモリの終わりを超えて書き込もうとします。
最も簡単な方法(効率的ではない)はsprintf
sprintf(str, "%s%c", str, chr);
両方の文字列はnullで終了する必要があります。単一の文字はnullで終了しないため、strcatが文字の最後までの連結を停止するタイミングは未定義です。また、文字列には、元の文字列と結果の文字列の両方に対して少なくとも十分なスペースが含まれている必要があります。
これは機能します:
char string[10] = "";
char* currentChar = "B";
strcat(string, currentChar);
currentChar = 'B' であることがわかっています。
これはできる
strcat(string, "B\0");
currentChar が 'B' としてハードコーディングされることがわかっている場合、これは適切なアプローチです。
また、char currentChar = 'B'; の必要もなくなります。
strcatの最初の引数には、残りの文字列を保持するのに十分なスペースが必要です。""は定数文字列であるため、GCCはスペースを割り当てません。
十分なスペースのある配列にします。
char buf[1024];
strcat(buf, "");
strcat(buf, "B");