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

胡金庫 2023年10月12日
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つ並んでいる場合は空文字列を返すことに注意してください。同様の機能は、このページ で詳細に説明されている strtokstrtok_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'
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

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

LinkedIn Facebook

関連記事 - C String