こんにちは、もがちゃんです。
今回は、C言語で文字列を連結する場合に良く使用するstrcatの使い方を簡単なサンプルソースとともに説明します。
目次
strcatの構文
#include <string.h>
char* strcat(char* restrict s1, const char* restrict s2);
strcatの説明
strcatは、s1のポインタが指す文字列の終端文字(’\0’)位置にs2のポインタが指す終端文字(’\0’)を含む文字列をコピーします。
strcat関数は、s2が指す文字列(終端ナル文字を含む。)のコピーをs1が指す文字列の最後に付加する。s2の先頭の文字が、s1が指す文字列の最後のナル文字を書き換える。領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義とする。
JISX3010 プログラム言語C
s1
連結先文字列の先頭ポインタを指定します。
s1が指すポインタの領域は、s2のポインタが指す文字列を連結しても不足しないだけの十分なメモリ領域が必要です。
s2
連結文字列の先頭ポインタを指定します。
返却値
s1を返します。
strcatの使い方サンプル
strcatを使った簡単なサンプルプログラムとその実行結果を紹介します。
サンプルプログラムとその実行結果

strcatを使ったサンプルプログラムの実行結果
#include <stdio.h>
#include <string.h>
int main(void) {
char s1[256];
char s2[16];
memset(s1, '#include <stdio.h>
#include <string.h>
int main(void) {
char s1[256];
char s2[16];
memset(s1, '\0', sizeof(s1));
memset(s2, '\0', sizeof(s2));
/* s1 = "", s2 = "s2 string" */
strcpy(s2, "s2 string");
fprintf(stdout, "s1[%s]\n", s1);
fprintf(stdout, "s2[%s]\n", s2);
fprintf(stdout, " ---- strcat(s1, s2) ----\n");
fprintf(stdout, "s1[%s]\n",strcat(s1, s2));
fprintf(stdout, "\n");
/* s1 = "s1 string", s2 = "s2 string" */
strcpy(s1, "s1 string");
strcpy(s2, "s2 string");
fprintf(stdout, "s1[%s]\n", s1);
fprintf(stdout, "s2[%s]\n", s2);
fprintf(stdout, " ---- strcat(s1, s2) ----\n");
fprintf(stdout, "s1[%s]\n",strcat(s1, s2));
}
', sizeof(s1));
memset(s2, '#include <stdio.h>
#include <string.h>
int main(void) {
char s1[256];
char s2[16];
memset(s1, '\0', sizeof(s1));
memset(s2, '\0', sizeof(s2));
/* s1 = "", s2 = "s2 string" */
strcpy(s2, "s2 string");
fprintf(stdout, "s1[%s]\n", s1);
fprintf(stdout, "s2[%s]\n", s2);
fprintf(stdout, " ---- strcat(s1, s2) ----\n");
fprintf(stdout, "s1[%s]\n",strcat(s1, s2));
fprintf(stdout, "\n");
/* s1 = "s1 string", s2 = "s2 string" */
strcpy(s1, "s1 string");
strcpy(s2, "s2 string");
fprintf(stdout, "s1[%s]\n", s1);
fprintf(stdout, "s2[%s]\n", s2);
fprintf(stdout, " ---- strcat(s1, s2) ----\n");
fprintf(stdout, "s1[%s]\n",strcat(s1, s2));
}
', sizeof(s2));
/* s1 = "", s2 = "s2 string" */
strcpy(s2, "s2 string");
fprintf(stdout, "s1[%s]\n", s1);
fprintf(stdout, "s2[%s]\n", s2);
fprintf(stdout, " ---- strcat(s1, s2) ----\n");
fprintf(stdout, "s1[%s]\n",strcat(s1, s2));
fprintf(stdout, "\n");
/* s1 = "s1 string", s2 = "s2 string" */
strcpy(s1, "s1 string");
strcpy(s2, "s2 string");
fprintf(stdout, "s1[%s]\n", s1);
fprintf(stdout, "s2[%s]\n", s2);
fprintf(stdout, " ---- strcat(s1, s2) ----\n");
fprintf(stdout, "s1[%s]\n",strcat(s1, s2));
}

strcatの使い方まとめ
- s1で指定するポインタが指す領域は、s2のポインタが指す文字列を連結しても大丈夫なだけの十分な領域が必要です。
- s1、s2のポインタが指す文字列には終端文字(’\0’)が必要です。
- s1で指定するポインタの領域とs2で指定するポインタの領域が重なり合う場合の動作は不定です。(使用できない)