C言語関係掲示板

過去ログ

No.471.strtokで"abc,,,def,ghi"を分解できるか

[戻る] [ホームページ]
No.3408

strtokについて
投稿者---しんいち(2002/11/11 15:08:04)


初歩的な質問なのですがstrtokについて教えて下さい。

"abc,def,ghi"という文字列をstrtokを使い「,」で分解すると
abc
def
hij
となります。

例えば、"abc,,,def,ghi"と「,」が幾つもあったとしても、
abc
def
hij
となります。どうしてなのですか。?

abc


def
hij
のように「,」の次に「,」であった場合、NULLにするにはどうしたら
よいのですか。

#include <stdio.h>
#include <strings.h>

main()
{
char buff[128] ;
char wk1[20];
char wk2[20];
char wk3[9];
char *pr ;

strcpy(buff,"abc,efg,hij") ;
buff[strlen(buff)] = '\0' ;

pr = strtok(buff, ",") ;
if(pr) strcpy(wk1, pr) ;
pr = strtok(NULL, ",") ;
if(pr) strcpy(wk2, pr) ;
pr = strtok(NULL, ",") ;
if(pr) strcpy(wk3, pr) ;

printf("wk1 = %s\n",wk1) ;
printf("wk2 = %s\n",wk2) ;
printf("wk3 = %s\n",wk3) ;
}


No.3409

Re:strtokについて
投稿者---kamadoma(2002/11/11 16:04:42)


>初歩的な質問なのですがstrtokについて教えて下さい。
>
>"abc,def,ghi"という文字列をstrtokを使い「,」で分解すると
>abc
>def
>hij
>となります。
>
残念ながらstrtokはそのような仕様には対応できない関数です。
自作関数を作成して空文字も格納できるようなものを私は関数化しておき
それをいつも使っています。



No.3410

Re:strtokについて
投稿者---aki(2002/11/11 16:24:23)


>のように「,」の次に「,」であった場合、NULLにするにはどうしたら
>よいのですか。

私も、これを実現するのは strtok を使う限り不可能だと思います。
strtok(buff, ",") は次のように動作します。

1  buff[0]から文字列を調べる。まず、,をすべてスキップする。
   スキップ中に文字列末尾に到達した場合はNULLを返す。

2  スキップ後の最初の一文字目の文字へのポインタを保存。

3  そこから次の,を探す。

4  見つかった,をナル文字で書き換える。
   見つからなければ2で保存しておいたポインタを返す。

5  次のstrtok呼び出しで使うためにそのナル文字の直後の文字
   へのポインタを保存する。

6  2で保存しておいたポインタを返す。

引き続いての呼び出し、strtok(NULL, ",") では文字列が残っていれば、
5で保存されたポインタの指す場所から同じように処理が行われます。