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 */
;