2011-01-29 16 views
6

は、私は、この操作をしようとしたとき、私はセグメンテーションフォールトを取得見つける:strcatを文字列に連結しますか? GDBを使用して

strcat(string,&currentChar); 

その文字列が

char * string = ""; 

として初期化され、currentCharが

char currentChar = 'B'; 

ない理由で考えますこの結果、セグメンテーションフォルトが発生しますか?

strcatを使用することができない場合、どのように文字列にcharを連結できますか?

+3

strcatのは、null終端文字列を必要とすることだと思います。あなたの単一のcharはヌルを持っていないので、strcatは、ラインのどこかでヌルを見つけるまでコピーを保持します。これは、事故によって2バイト目にあるかもしれません。あるいは、数ギガバイト、スタック上でストンプする –

答えて

4

&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"); 
+0

プログラムがsegfaultingである理由はありません。 –

+0

@Foo '&currentChar'はnullを指さず、文字列を終了します。もちろんstrcpyはsegフォールトを起こします。 – Elalfer

+0

これをカバーするので答えとして受け入れます。A:NULLターミネーターが必要です。 B:文字列のスペースを増やす必要がありました。 – Blackbinary

1

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

メモリが何を参照するのかわからないので、コードがアクセスするときに問題が発生するはずです。

それに加えて、文字列引数には文字を追加する余地がありません。その記憶はどこに書かれていますか?この文字列に関連付けられたメモリの末尾を超えて書き込みを試みます。

+0

プログラムがセグメンテーション違反でない理由は... –

-1

両方の文字列はNULLで終了する必要があります。単一のcharはnullで終端されていないので、strcatが文字を最後まで連結しなくなると、未定義です。また、文字列には、元の文字列と結果の文字列の両方に十分なスペースが必要です。

これは動作します:

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

文字列に十分なスペースがないため動作しません。私の意見を見るには、試してみてください:http://ideone.com/0jjST –

+0

コードには2つの問題があります。第1引数には十分なスペースがなく、第2引数にはターミネーターがありません。なぜあなたは1つの問題に集中していますか? –

+0

それは理由の一部ですが、あなたは正しいですが、それは主要なものではありません。セグメンテーションの主な原因を含むように修正されました – helloworld922

-1

strcatの最初の引数は、文字列の残りの部分を保持するのに十分なスペースを持っている必要があります。 ""は定数文字列であるため、GCCはスペースを割り当てません。

が十分なスペースを持つ配列行います。他の人が答えたよう

char buf[1024]; 

strcat(buf, ""); 
strcat(buf, "B"); 
7

、[& currentCharは * のcharまたはのcharへのポインタであるが、Cの文字列は、文字です]またはconst char *です。

一つの方法は、チャーストリングが作成された最小の文字列を連結し、文字列に文字を変換するためにそれを使用するSTRCATを使用します。

例:唯一の1文字と接尾'\ 0'をして、単純な文字列を作る

あなたの質問に適用
char cToStr[2]; 
cToStr[1] = '\0'; 

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

cToStrは、文字列 "B" を仮定します:

cToStr[0] = currentChar; 

そしてstrcatのは動作します!

strcat (string, cToStr); 
0

私は最も簡単な方法(効率的ではないが)sprintf

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

関連する問題