こんばんは。きわさです。
今回もC言語の文字列操作の備忘録です。
strstr
文字列1から文字列2を探索する
書式
char* strstr(const char *s1, const char *s2)
概要
文字列s1から文字列s2を探索し、見つかった位置のポインタを返却する
引数
const char *s1: 探索対象の文字列
const char *s2: 探索する文字列
戻り値
文字列が見つかった位置のポインタ
使用例
#include "string.h"
void main(void) {
    char str1[] = "Sample Message";
    char str2[] = "Mes";
    char str3[] = "Test";
    char str4[] = "";
    char *ret = NULL;
    ret = strstr(str1, str2);
    printf("%s\n", ret);
    ret = strstr(str1, str3);
    printf("%s\n", ret);
    ret = strstr(str1, str4);
    printf("%s\n", ret);
    return;
}
結果
Message
(null)
Sample Message
“Sample Message”のうち”Mes”が見つかった位置の文字列は”Message”です。また、”Test”のように、見つからない場合はnullを返却します。空文字””を探索した場合は探索対象のもともとの文字列ポインタを返却します。
strtok
文字列1を文字列2で分離する
書式
char* strtok(char *s1, const char *s2)
概要
文字列s1を文字列s2で区切り、そこまでの文字列を返却する
引数
char *s1: 文字列
const char *s2: 区切り文字
戻り値
区切り文字までの文字列
使用例
#include "string.h"
void main(void) {
    char str1[] = "Sample Message";
    char str2[] = " ";
    char *ret = NULL;
    ret = strtok(str1, str2);
    printf("%s\n", ret);
    return;
}
結果
Sample
str1は”Sample Message”を” “すなわち半角スペースで区切り、その文字列を返却します。strtokにより返却されるretは”Sample”ですが、strtok後のstr1も同様に”Sample”となります。これは実際はstrtokによりstr1の”Sample Message”が”Sample\0Message”になっているということを意味しています。
strtokの引数1の文字列はconstではなく値が書き換えられてしまうことに注意が必要です。
また、区切られた文字をすべて取得することも可能です。
使用例
#include "string.h"
void main(void) {
    char str1[] = "This is a Sample Message";
    char str2[] = " ";
    char *ret = NULL;
    ret = strtok(str1, str2);
    while(ret) {
        printf("%s\n", ret);
        ret = strtok(NULL, str2);
    }
    return;
}
結果
This
is
a
Sample
Message
2回目以降のstrtokの引数をNULLとすることで、次の文字列を取得できます。戻り値がNULLになるまでループを繰り返すことですべての文字列を取得できます。
strlen
文字列長を求める
書式
size_t strlen(const char *s)
概要
文字列sの文字列長を返却する
引数
const char *s: 文字列
戻り値
文字列長
使用例
#include "string.h"
void main(void) {
    char str1[] = "Sample Message";
    printf("%d\n", strlen(str1));
    printf("%d\n", sizeof(str1));
    return;
}
結果
14
15
文字列長は文字数そのものを指します。strlenは文字列長を返しますが、sizeofの場合は\0を含むため、文字列長+1を返します。
文字列長を求めるのは文字の操作ではほぼ必須ですね。文字の分離もカンマ区切りなどで使う機会はありそうですね。
