1. ホーム
  2. c

[解決済み】C言語でconst/literal文字列を連結する方法は?

2022-04-14 13:58:44

質問

C言語で作業しているのですが、いくつかのものを連結する必要があります。

今はこんな感じです。

message = strcat("TEXT ", var);

message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));

さて、C言語の経験がある方ならお気づきだと思いますが、これを実行しようとするとsegmentation faultが発生します。では、どのように回避すればいいのでしょうか?

解決方法は?

C言語では、文字列は単なる char 配列です。そのため、他の文字列と直接連結することはできません。

を使用することができます。 strcat 関数が指す文字列を追加します。 src で指される文字列の末尾に dest :

char *strcat(char *dest, const char *src);

以下は cplusplus.comの例 :

char str[80];
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");

第1パラメータには、デスティネーションバッファそのものを指定する必要があります。 デスティネーションバッファはchar配列バッファである必要があります。 例. char buffer[1024];

確認する は、最初のパラメータにコピーするものを格納するのに十分なスペースがあること。 もし利用可能であれば、以下のような関数を使用するのが安全です。 strcpy_sstrcat_s のように、デスティネーションバッファのサイズを明示的に指定する必要があります。

備考 : 文字列リテラルは定数であるため、バッファとして使用することはできません。したがって、常にバッファ用の文字配列を確保する必要があります。

の戻り値は strcat これは単に、最初の引数として渡されたのと同じポインタを返すだけなので、無視してもかまいません。これは便宜上存在するもので、呼び出しを一行のコードに連結することができます。

strcat(strcat(str, foo), bar);

つまり、あなたの問題は次のように解決できるのです。

char *foo = "foo";
char *bar = "bar";
char str[80];
strcpy(str, "TEXT ");
strcat(str, foo);
strcat(str, bar);