C言語編 標準ライブラリのリファレンス wcstok

先頭へ戻る

wcstok関数

概要 ワイド文字列を分割する。
ヘッダ wchar.h
形式 wchar_t* wcstok(wchar_t* str, const wchar_t* set, wchar_t** ptr);
引数 str 対象のワイド文字列。2回目以降の呼び出し時には、ヌルポインタを指定。
set 区切り文字を書き並べたワイド文字列。
ptr 関数が内部で作業用に使うポインタ変数を呼び出し側で用意し、それを指すポインタを与える。
戻り値 分割して得られた文字の並びを指すポインタを返す。文字の並びが得られなかった場合は、ヌルポインタが返される。
詳細 まず前提として、この関数は何度も繰り返し呼び出すような使い方をすることを理解しておくこと。
この関数の目的は、あるワイド文字列を、特定の区切り文字ごとに分割することである。例えば、L"abc,defgh,ij" という文字列に対し、区切り文字を L"," として与えれば、L"abc"、L"defgh"、L"ij" を得られる。
1度目の呼び出しの際にだけ、引数str に対象となるワイド文字列を指定する。2度目以降は、前回の続きから調べるということを表すために引数str をヌルポインタとする。したがって、1度目と、2度目以降とでは、引数str に与えるべき値は異なる。引数set に関しては、その必要があれば呼び出しごとに異なっても構わない。
引数set に含まれる各ワイド文字がそれぞれ区切り文字の候補である。例えば L".," を与えたとすれば、L'.' でも L',' でも区切り文字とみなされる。
マルチバイト文字列版の strtok関数とは異なり、作業用の変数は関数内部ではなく、外部で用意して与える仕様になっている。したがって、同時に2つの異なるワイド文字列を対象として、並列的に関数を呼び出しても、異なる作業用変数を与えていれば問題なく動作する。
注意 関数内で、引数str が指すワイド文字列の内容は書き換えられることに注意(引数str には const修飾子が付いていない)。具体的には、区切り文字の部分を L'\0' に書き換えている。こうして、戻り値として返されるポインタが、引数str が指すワイド文字列内のどれかのワイド文字を指しており、かつ終端に L'\0' が適切に置かれていることが保証される。
使用例
#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
    wchar_t str[] = L"abc,defhi,jk";
    const wchar_t* const separator = L",";
    wchar_t* work;
    wchar_t* token;

    setlocale(LC_CTYPE, "");

    token = wcstok( str, separator, &work );
    while( token != NULL ){
        wprintf( L"%ls\n", token );
        token = wcstok( NULL, separator, &work );
    }

    wprintf( L"\n" );
    wprintf( L"元の文字列が直接書き換えられていることを確認\n" );
    wprintf( L"%ls\n", str );

    return 0;
}

実行結果:

abc
defgh
ij

元の文字列が直接書き換えられていることを確認
abc
関連 マルチバイト文字列版の strtok関数がある。ただし、wcstok関数にある3個目の引数がなく、並列的な呼び出しに問題がある。
解説章


参考リンク



更新履歴

'2018/4/20 全体的に文章を見直し修正。
「NULL」という表記を「ヌルポインタ」に修正。

'2018/4/5 VisualStudio 2013 の対応終了。

'2018/4/2 「VisualC++」という表現を「VisualStudio」に統一。

'2018/1/22 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ


はてなブックマーク Pocket に保存 Twitter でツイート Twitter をフォロー
Facebook でシェア Google+ で共有 LINE で送る rss1.0 取得ボタン RSS
管理者情報 プライバシーポリシー