Cでconst/literal文字列を連結するにはどうすればよいですか?

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.");

最初のパラメーターには、宛先バッファー自体を指定する必要があります。宛先バッファーは、char 配列バッファーでなければなりません。例:char buffer[1024];

確認 最初のパラメーターには、コピーしようとしているものを保存するのに十分なスペースがあることを確認してください。可能であれば、次のような関数を使用する方が安全です:strcpy_s そして strcat_s 宛先バッファのサイズを明示的に指定する必要があります。

注意 :文字列リテラルは定数であるため、バッファとして使用できません。したがって、バッファには常に char 配列を割り当てる必要があります。

strcat の戻り値 単純に無視できます。最初の引数として渡されたものと同じポインターを返すだけです。これは利便性のためにあり、呼び出しを 1 行のコードにまとめることができます:

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

したがって、問題は次のように解決できます:

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

strcat の使用を避ける Cコードで。最もクリーンで、最も重要なことですが、最も安全な方法は snprintf を使用することです :

char buf[256];
snprintf(buf, sizeof buf, "%s%s%s%s", str1, str2, str3, str4);

一部のコメンターは、引数の数がフォーマット文字列と一致しない可能性があり、コードは引き続きコンパイルされるという問題を提起しましたが、ほとんどのコンパイラは、この場合、すでに警告を発行しています.


文字列はコンパイル時に連結することもできます。

#define SCHEMA "test"
#define TABLE  "data"

const char *table = SCHEMA "." TABLE ; // note no + or . or anything
const char *qry =               // include comments in a string
    " SELECT * "                // get all fields
    " FROM " SCHEMA "." TABLE   /* the table */
    " WHERE x = 1 "             /* the filter */ 
                ;