C 言語で strtok 関数を使用する

胡金庫 2023年10月12日
  1. 与えられたデリミタで文字列をトークン化するために strtok 関数を使用する
  2. 関数 strtok_r を用いて 2つのデリミタを持つ文字列をトークン化する
C 言語で strtok 関数を使用する

この記事では、C 言語での strtok 関数の使い方について複数の方法を示します。

与えられたデリミタで文字列をトークン化するために strtok 関数を使用する

関数 strtok<string.h> ヘッダファイルで定義されている C 標準ライブラリの一部です。この関数は与えられた文字列を指定された区切り文字で分割されたトークンに分割します。strtok は 2つの引数を取ります。1 番目の引数はトークン化する文字列へのポインタであり、2 番目の引数はデリミタ文字列です。区切り文字の文字列は文字の集合として処理され、別の区切り文字を示すことに注意してください。この関数は、次のトークンを表すヌル文字列へのポインタを返します。ただし、同じ文字列を複数回 strtok を呼び出して解析する場合は、最初の関数呼び出しの後に最初のポインタの引数を NULL にしなければならないことに注意してください。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *str1, *token;
  int j;

  if (argc != 3) {
    fprintf(stderr, "Usage: %s string delim\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  for (j = 1, str1 = argv[1];; j++, str1 = NULL) {
    token = strtok(str1, argv[2]);
    if (token == NULL) break;
    printf("%d: %s\n", j, token);
  }

  exit(EXIT_SUCCESS);
}

サンプルコマンド

./program "Temporary string to be parsed" " "

出力:

1: Temporary
2: string
3: to
4: be
5: parsed

関数 strtok_r を用いて 2つのデリミタを持つ文字列をトークン化する

あるいは、strtok_r と呼ばれる別のバージョンの関数も利用できます。これらの関数はどちらも第一引数として渡された文字列を変更します。以下のコード例では、与えられた文字列を 2つのレベルの階層にトークン化しています。最初の階層は、プログラムの第 2 引数として渡されたデリミタ上で分割されたトークンで構成されています。内側のループは、最初のトークン化から各トークンを分割し、最後にプログラムは結果をコンソールに出力します。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  char *str1, *str2, *token, *subtoken;
  char *saveptr1, *saveptr2;
  int j;

  if (argc != 4) {
    fprintf(stderr, "Usage: %s string delim subdelim\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  for (j = 1, str1 = argv[1];; j++, str1 = NULL) {
    token = strtok_r(str1, argv[2], &saveptr1);
    if (token == NULL) break;
    printf("%d: %s\n", j, token);

    for (str2 = token;; str2 = NULL) {
      subtoken = strtok_r(str2, argv[3], &saveptr2);
      if (subtoken == NULL) break;
      printf(" --> %s\n", subtoken);
    }
  }

  exit(EXIT_SUCCESS);
}

サンプルコマンド

./program "Temporary string to be parsed" " " "aeio"

出力:

1: Temporary
 --> T
 --> mp
 --> r
 --> ry
2: string
 --> str
 --> ng
3: to
 --> t
4: be
 --> b
5: parsed
 --> p
 --> rs
 --> d
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C String