標準関数(文字列の処理 str***)

(ブログ記事の一覧は「こちら」)

文字列の処理を行うC言語の標準関数について、よく使われる関数や、知っておくと便利な関数を紹介します。

まず、以下のinclude文を定義する必要があります。

#include <string.h>

strcat 文字列の連結

char *strcat(char *s1, const char *s2);

【引数】
s1: 連結先の文字型配列
s2: 連結する文字列

【戻り値】
s1の値。つまり返却値は連結後の文字列を指す。

サンプル
#include <string.h>
#include <stdio.h>

int main(void)
{
    char str1[] = "ABC";
    char str2[] = "123";

    strcat(str1, str2);
    printf("%s\n", str1);    // ABC123

    return 0;
}

strcmp 文字列の比較

int strcmp(const char *s1, const char *s2);

【引数】
s1: 比較文字列1
s2: 比較文字列2

【戻り値】
s1 > s2 で正の値、s1 < s2 で負の値、s1 = s2で 0 を返す。

サンプル
#include <string.h>
#include <stdio.h>

int main(void)
{
    char str0[] = "ABC";
    char str1[] = "ABC";
    char str2[] = "123";

    int ret1 = strcmp(str0, str1);
    int ret2 = strcmp(str0, str2);

    printf("%d\n", ret1);    // 0
    printf("%d\n", ret2);    // 1

    return 0;
}

strcpy 文字列のコピー

char *strcpy(char *s1, const char *s2);

【引数】
s1: 複写先の文字型配列
s2: 複写する文字列

【戻り値】
s1の値。つまり返却値はコピー後の文字列を指す。

サンプル
#include <string.h>
#include <stdio.h>

int main(void)
{
    char str1[] = "ABCDEF";
    char str2[] = "123";

    strcpy(str1, str2);
    printf("%s\n", str1);    // 123

    return 0;
}

strlen 文字列の長さの取得

size_t strlen(const char *s);

【引数】
s: 文字列
【戻り値】
文字列*sの長さ。

サンプル
#include <string.h>
#include <stdio.h>

int main(void)
{
    char str1[] = "ABCDEF";
    char str2[] = "123";

    int ret1 = strlen(str1);
    int ret2 = strlen(str2);

    printf("%d\n", ret1);    // 6
    printf("%d\n", ret2);    // 3

    return 0;
}

strchr 文字列の先頭から文字を検索する

char *strchr(const char *s, int c);

【引数】
s: 検索対象文字列
c: 検索文字

【戻り値】
見つかったとき: 一致文字列の先頭アドレス
見つからなかったとき: NULL

サンプル
#include <string.h>
#include <stdio.h>

int main(void)
{
    char str[] = "ABCDEF";
    char c1 = 'E';
    char c2 = 'e';

    char *p1 = strchr(str, c1);
    char *p2 = strchr(str, c2);

    if (p1 != NULL) {
        printf("%cは文字列の%d番目にあります。\n", c1, p1 - str);
    } else {
        printf("%cは見つかりませんでした\n", c1);
    }
    if (p2 != NULL) {
        printf("%cは文字列の%d番目にあります。\n", c2, p2 - str);
    } else {
        printf("%cは見つかりませんでした\n", c2);
    }

    return 0;
}

strstr 文字列1から文字列2を検索

char *strstr(const char *s1, const char *s2);

【引数】
s1: 検索対象文字列
s2: 検索文字列

【戻り値】
見つかったとき: 一致文字のアドレス
見つからなかったとき: NULL

サンプル
#include <string.h>
#include <stdio.h>

int main(void)
{
    char s1[] = "abcdefghijklmn";
    char s2[] = "defgh";
    char s3[] = "xyz";

    char *p;
    // 一致する場合
    p = strstr(s1, s2);
    printf("%s\n", p);   // defghijklmn
    p = strstr(s1, s3);
    // 一致しない場合
    printf("%s\n", p);   // (null)

    return 0;
}

strtok 文字列を区切り文字で分解する

char *strtok(char *s1, const char *s2);

【引数】
s1: 分解対象文字列
s2: 区切り文字群。複数の区切り文字を指定することが可能。
例えば '?' と '/'と '!' で区切りたいときには "?/!" と指定。

【戻り値】
トークンが見つかったとき: 字句(トークン)へのポインタ
トークンが見つからなかったとき: NULL

サンプル
#include <string.h>
#include <stdio.h>

int main(void)
{
    char str[] = "abcde fg.123456.HI";
    char *tp;

    // 「スペース」「.」を区切り文字に指定
    tp = strtok(str, " .");
    puts( tp );
    while ( tp != NULL ) {
        tp = strtok( NULL," ." );
        if ( tp != NULL ) puts( tp );
    }

    return 0;
}