C 言語で strsep 関数を使用する
この記事では、C 言語での strsep
関数の使用する方法について複数の方法を示します。
関数 strsep
を使って文字列の中から与えられたトークンを検索する
strsep
は、<string.h>
ヘッダファイルで定義されている C 標準ライブラリの文字列ユーティリティの一部です。これを利用して、文字列オブジェクトから与えられた区切り文字で囲まれたトークンを抽出することができます。
strsep
は 2つの引数を取り、char*
へのポインタと char
へのポインタです。第一引数は検索する文字列のアドレスを渡すために用いられます。第 2 引数には、抽出されたトークンの先頭と末尾を示す区切り文字のセットを指定します。抽出されたトークン文字列では、区切り文字は破棄されることに注意してください。最初のトークンが見つかると、第 1 引数は、見つかった次のデリミタへのポインタを格納するように変更されます。
以下の例では、strsep
を 1 回呼び出すだけで、与えられた文字で区切られた 2つのトークンを抽出する方法を示します。プログラムは 2つのコマンドライン引数から文字列と区切り文字のセットを受け取り、必要に応じて供給されなかった場合は失敗して終了することに注意してください。次に、strdupa
関数呼び出しで文字列を複製し、strsep
で渡されたポインタを変更します。strdupa
はスタック上にダイナミックメモリを確保するので、呼び出し元はそこから返されたポインタを解放してはならません。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str1, *token;
if (argc != 3) {
fprintf(stderr, "Usage: %s string delim\n", argv[0]);
exit(EXIT_FAILURE);
}
str1 = strdupa(argv[1]);
if (!str1) exit(EXIT_FAILURE);
token = strsep(&str1, argv[2]);
if (token == NULL) exit(EXIT_FAILURE);
printf("extracted: '%s'\n", token);
printf("left: '%s'\n", str1);
exit(EXIT_SUCCESS);
}
サンプルコマンド:
./program "hello there" t
出力:
extracted: 'hello '
left: 'here'
あるいは、for
ループを実装して、strsep
関数を連続して呼び出し、最初に見つかったものだけを取り出すのではなく、与えられたデリミタを持つすべてのトークンを取り出すこともできます(前のサンプルコードで見たように)。ただし、strsep
はデリミタが 2つ並んでいる場合は空文字列を返すことに注意してください。同様の機能は、このページ で詳細に説明されている strtok
や strtok_r
ライブラリ関数を用いても提供されていますが、若干の違いはあります。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *str1, *token;
if (argc != 3) {
fprintf(stderr, "Usage: %s string delim\n", argv[0]);
exit(EXIT_FAILURE);
}
str1 = strdupa(argv[1]);
if (!str1) exit(EXIT_FAILURE);
for (int j = 1;; j++) {
token = strsep(&str1, argv[2]);
if (token == NULL) break;
printf("%d: '%s'\n", j, token);
}
exit(EXIT_SUCCESS);
}
サンプルコマンド:
./program "hello there" tl
出力:
1: 'he'
2: ''
3: 'o '
4: 'here'