C の strtok() および strtok_r() 関数と例
C には、文字列を区切り文字で分割するための 2 つの関数 strtok() と strtok_r() が用意されています。文字列の分割は非常に一般的なタスクです。たとえば、ファイルからの項目のカンマ区切りリストがあり、配列内の個々の項目が必要だとします。
strtok() 関数
strtok() メソッドは、指定された区切り文字に従って str[] を分割し、次のトークンを返します。すべてのトークンを取得するには、ループ内で呼び出す必要があります。トークンがなくなった場合は NULL を返します。
strtok() の構文
char * strtok (char * str , const char * delims );
パラメーター
- str : トークン化する文字列へのポインタです。 delims : すべての区切り文字を含む文字列です。
戻り値
- 文字列内で最初に見つかったトークンへのポインタを返します。
- これ以上トークンが見つからない場合は NULL を返します。
strtok() の例
例 1: strtok() を使用して文字列を分割する方法を示す C プログラム。
C
// C program for splitting a string> // using strtok()> #include> #include> int> main()> {> > char> str[] => 'Geeks-for-Geeks'> ;> > // Returns first token> > char> * token => strtok> (str,> ' - '> );> > // Keep printing tokens while one of the> > // delimiters present in str[].> > while> (token != NULL) {> > printf> (> ' % s
'> , token);> > token => strtok> (NULL,> ' - '> );> > }> > return> 0;> }> |
出力
Geeks for Geeks
例 2: このプログラムは、strtok() 関数を使用して区切り文字に基づいて文字列をトークン化する方法を示します。
C
// C code to demonstrate working of> // strtok> #include> #include> // Driver function> int> main()> {> > // Declaration of string> > char> gfg[100] => ' Geeks - for - geeks - Contribute'> ;> > // Declaration of delimiter> > const> char> s[4] => '-'> ;> > char> * tok;> > // Use of strtok> > // get first token> > tok => strtok> (gfg, s);> > // Checks for delimiter> > while> (tok != 0) {> > printf> (> ' %s
'> , tok);> > // Use of strtok> > // go through other tokens> > tok => strtok> (0, s);> > }> > return> (0);> }> |
出力
Geeks for geeks Contribute
実用化 strtok()
strtok() を使用すると、いくつかの区切り文字に基づいて文字列を複数の文字列に分割できます。あ シンプルなCSVファイル サポートはこの関数を使用して実装される可能性があります。 CSV ファイルには区切り文字としてカンマが含まれます。
例 3: C で strtok() 関数を使用して実装する方法を示す C プログラム。 シンプルなCSVファイル。
C
// C code to demonstrate practical application of> // strtok> #include> #include> // Driver function> int> main()> {> > // Declaration of string> > // Information to be converted into CSV file> > char> gfg[100] => ' 1997 Ford E350 ac 3000.00'> ;> > // Declaration of delimiter> > const> char> s[4] => ' '> ;> > char> * tok;> > // Use of strtok> > // get first token> > tok => strtok> (gfg, s);> > // Checks for delimiter> > while> (tok != 0) {> > printf> (> '%s, '> , tok);> > // Use of strtok> > // go through other tokens> > tok => strtok> (0, s);> > }> > return> (0);> }> |
出力
1997, Ford, E350, ac, 3000.00,
strtok_r() 関数
C の strtok() 関数と同様に、strtok_r() は文字列をトークンのシーケンスに解析する同じタスクを実行します。 strtok_r() は strtok() の再入可能バージョンであるため、スレッドセーフです。
strtok_r() の構文
char * strtok_r (char * str , const char * delim , char ** saveptr );
パラメーター
- str : トークン化する文字列へのポインタです。 delims : すべての区切り文字を含む文字列です。 saveptr : これは、同じ文字列を解析する連続した呼び出し間のコンテキストを維持するために strtok_r() によって内部的に使用される char * 変数へのポインターです。
戻り値
- 文字列内で最初に見つかったトークンへのポインタを返します。
- これ以上トークンが見つからない場合は NULL を返します。
strtok_r() の例
例 1: strtok_r() の使用法を示す簡単な C プログラム。
C
// C program to demonstrate working of strtok_r()> // by splitting string based on space character.> #include> #include> int> main()> {> > char> str[] => 'Geeks for Geeks'> ;> > char> * token;> > char> * rest = str;> > while> ((token = strtok_r(rest,> ' '> , &rest)))> > printf> (> '%s
'> , token);> > return> (0);> }> |
出力
Geeks for Geeks
C でのネストされたトークン化
例 2: 以下の C プログラムは、ネストされたトークン化のための strtok_r() 関数の使用を示しています。
C
#include> #include> int> main()> {> > char> str[] => 'Hello, World! Geeks for Geeks.'> ;> > const> char> outer_delimiters[] => '!.'> ;> > const> char> inner_delimiters[] => ' ,'> ;> > char> * token;> > char> * outer_saveptr = NULL;> > char> * inner_saveptr = NULL;> > token = strtok_r(str, outer_delimiters, &outer_saveptr);> > while> (token != NULL) {> > printf> (> 'Outer Token: %s
'> , token);> > char> * inner_token = strtok_r(> > token, inner_delimiters, &inner_saveptr);> > while> (inner_token != NULL) {> > printf> (> 'Inner Token: %s
'> , inner_token);> > inner_token = strtok_r(NULL, inner_delimiters,> > &inner_saveptr);> > }> > token = strtok_r(NULL, outer_delimiters,> > &outer_saveptr);> > }> > return> 0;> }> |
出力
Outer Token: Hello, World Inner Token: Hello Inner Token: World Outer Token: Geeks for Geeks Inner Token: Geeks Inner Token: for Inner Token: Geeks
strtok() と strtok_r() の違い
以下に示すように、strtok() 関数と strtok_r() 関数の違いを表形式で見てみましょう。
| はい・いいえ。 | strtok() | strtok_r() |
|---|---|---|
| 1. | 文字列 str を一連のトークンに分割するために使用されます。 | これは、文字列をトークンのパターンにデコードするために使用されます。 |
| 2. | 構文は次のとおりです。 char *strtok(char *str, const char *delim) | その構文は次のとおりです。 char *strtok_r(char *string, const char *リミッター, char **コンテキスト); |
| 3. | デリミタを使用して続行します。 | これは、strtok() の再入力されたバリアントです。 |
| 4. | 2 つのパラメータを取ります。 | 3 つのパラメータを取ります。 |
| 5. | 文字列内で最初に見つかったトークンへのポインタを返します。 | 文字列内で最初に見つかったトークンへのポインタを返します。 |
| 6. | スレッドセーフではありません。 | スレッドセーフです。 |