
生徒
strcatって何ですか?

先生
strcatとは「string(文字列)」を「concatenate(連結する)」と言う言葉を省略したものだよ

生徒
なるほど。文字を連結したいときに使う関数なんですね。

先生
そうだね。実際に仕様や使い方を見てみようか。
仕様
#include <string.h>
char *strcat(char *restrict s1, const char *restrict s2);
概要 | 文字列を連結する |
ヘッダ | #include <string.h> |
関数概要 | char *strcat(char *restrict s1, const char *restrict s2) |
戻り値 | s2をs1に連結し、連結後のs1を返す。 |
使い方
文字列の用意
まず初めに連結する二つの文字列を用意して、表示します。
#include <stdio.h>
int main(void) {
char s1[] = "Hello ";
char s2[] = "World";
printf("%s\n", s1);
printf("%s\n", s2);
return 0;
}
Hello
World
文字列を連結
次に文字列を連結させます。
#include <string.h>
#include <stdio.h>
int main(void)
{
char s1[100] = "Hello ";
char s2[10] = "World";
printf("%s\n", s1);
printf("%s\n", s2);
strcat(s1, s2); // 連結
printf("%s\n", s1);
printf("%s\n", s2);
return 0;
}
Hello
World
Hello World
World
きちんと連結されていることが分かります。
注意
文字列を用意した時に、メモリの確保を行っていないとエラーが出てしまうようです。
// エラーメッセージ
illegal hardware instruction
なので、使用する際は、しっかりメモリの確保を行ってください。
// エラーが出ます
char s1[] = "Hello ";
char s2[] = "World";
// OK
char s1[100] = "Hello ";
char s2[10] = "World";
自作してみる
それでは、仕様に従って自作してみます。
仕様は以下のような関数になっております。
char *strcat(char *restrict s1, const char *restrict s2) {
}
中身を書いていきましょう。
char* strcat(char *restrict s1, const char *restrict s2) {
size_t i, j;
for (i = 0; s1[i] != '\0'; i++) {} // s1のポインタを\0まで進めます。
for (j = 0; s2[j] != '\0'; j++) {
s1[j + i] = s2[j]; // s1の'\0'の部分からs2の文字列を追加していきます。
}
s1[j + i] = '\0'; // 最後に'\0'を入れる
return s1;
}
図による説明


これで、自作strcat関数の作成完了です。
最後に、実行してみましょう。
#include <stdio.h>
// string.hライブラリはstrcat関数を自作したので不要です。
char* strcat(char *restrict s1, const char *restrict s2) {
size_t i, j;
for (i = 0; s1[i] != '\0'; i++) {}
for (j = 0; s2[j] != '\0'; j++) {
s1[j + i] = s2[j];
}
s1[j + i] = '\0';
return s1;
}
int main (void) {
char a[100] = "Hello ";
char b[10] = "World";
strcat(a, b);
printf("%s", a);
return 0;
}
Hello World
コメント