標準関数(文字列の処理 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; }