C言語で文字列をトークン化する方法|strtok関数の使い方を徹底解説
C言語における文字列のトークン化とは
この記事では、C言語で文字列をトークン化(分割)する方法について解説します。C言語の標準ライブラリには、この目的のための関数として strtok が用意されています。
strtok 関数は、指定された区切り文字(デリミタ)を使って、元の文字列を一連の小さな文字列(トークン)へと分割します。
strtok関数のプロトタイプ宣言
char *strtok(char *str, const char *delim);
パラメータ
- str:分割対象となる文字列です。この文字列の内容は関数によって直接書き換えられ、小さなトークンへと分割されます。
- delim:区切り文字を含むC文字列です。呼び出しごとに異なる区切り文字を指定することも可能です。
戻り値
文字列から見つかった最初のトークンへのポインタを返します。これ以上取得できるトークンが残っていない場合は、NULLポインタが返されます。
サンプルコード
#include <string.h>
#include <stdio.h>
int main () {
char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* 最初のトークンを取得 */
token = strtok(str, s);
/* 残りのトークンを順番に取り出して表示 */
while( token != NULL ) {
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
実行結果
This is www.tutorialspoint.com website
プログラムの流れを解説
まず strtok(str, s) を呼び出して、最初のトークンを取得します。その後は第一引数に NULL を渡して strtok(NULL, s) を呼び続けることで、前回の続きから次のトークンを順番に取り出せます。すべてのトークンを取得し終えると NULL が返されるため、それを while ループの終了条件として利用しています。
strtok関数を使用する際の注意点
- 元の文字列が破壊される:strtokは引数として渡された文字列を直接書き換えます。元の文字列を後で使いたい場合は、あらかじめコピーを取っておきましょう。
- 連続する区切り文字は1つとして扱われる:区切り文字が連続していても、空のトークンは生成されません。
- スレッドセーフではない:内部に静的な状態を持つため、マルチスレッド環境では代替関数である
strtok_rの使用が推奨されます。
まとめ
C言語で文字列を区切り文字ごとに分割したい場合は、標準ライブラリの strtok 関数が便利です。最初の呼び出しで元の文字列を渡し、以降は NULL を渡して呼び出すだけで、すべてのトークンを簡単に取得できます。ただし、元の文字列が変更される点やスレッドセーフではない点には注意して使用しましょう。
-
C言語のstrcmp()関数とは?文字列比較の基本と使い方を徹底解説
C言語の標準ライブラリ関数 int strcmp(const char *str1, const char *str2) は、ポインタ str1 が指し示す文字列と、str2 が指し示す文字列を比較するための関数です。C言語において、文字型の配列は「文字列」と呼ばれます。まずは文字列の基本的な扱い方から確認していきましょう。文字列の宣言文字列(文字配列)の宣言は以下のように行います。char stringname [size];例えば、char string[50]; と宣言すれば、最大50文字の長さを持つ文字列を格納できます。文字列の初期化文字列の初期化には、主に次の2つの方法があります。1
-
【PHP入門】highlight_string()関数の使い方とサンプルコード解説
highlight_string()関数は、PHPの構文をハイライト(色分け)表示した状態で文字列を出力する組み込み関数です。PHPコードのサンプルを見やすく表示したい場合などに便利で、チュートリアルサイトやドキュメント作成によく活用されています。 構文 highlight_string(string, return) パラメータ string − ハイライト表示したい文字列を指定します。文字列中にPHPタグ(<?php ?>)が含まれていると、その部分がPHP構文として解析され、色分け表示されます。 return − このパラメータにtrueを設定す