strtok() のスマートな使い方

C の標準ライブラリに strtok() という関数がある。

文字列を区切り文字で区切って、要素ごとに取得できる便利な関数ではあるのですが、

スレッドセーフではない事と、オリジナルの文字列を改変してしまうため、

世間では、その使用をあまりお勧めされない関数です。

でも、便利は便利なので、小さなコンバータなどの簡単なプログラムでは良く使います。

(しっかりとしたプログラムでは、同じような処理を行う関数を別途作成して使用しています。)

で、Web検索でよく出てくる使い方(コード)を見ると、

「1回目に文字列を指定して、2回目からはNULLを指定する。」

という、オーソドックスな解説とサンプルコードがすぐに見つかりますが、

これをまじめに実装すると、同じ処理を2回書かなくてはいけなくなり、

コードが冗長(=見苦しくなって)してしまいます。

そこで、私は、次のように使用しています。

// buff に分割対象の文字列が入っている
char* t = buff;
while(t = strtok(t, "\t"))
{
    // t を何かしらに使う
    ・・・
    t = NULL;
}


まず、対象の文字列の先頭アドレスを指すポインタを作って、

最初にそのポインタを strtok() に渡します。

そして、そのポインタで、strtok() から、結果を受け取ります。

次からは、そのポインタを NULL に初期化して strtok() に渡します。

こうすると、コードの冗長化が防げます。

コードの冗長化を防いで、可読性を上げるのは、

こういった簡単な書き方の工夫の積み重ねです。
[PR]
by isoq | 2010-01-04 15:45 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< GUI プログラムでコンソール... 新年明けましておめでとうございます >>