[C言語] string.hライブラリのstrcat関数を自作してみた

C言語
生徒
生徒

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

コメント

タイトルとURLをコピーしました