ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.4019562 strtokについて
質問者:tobasu strtokを使うにあって注意すべき点がしりたいのですが、
test1やtest2は書き換わるので、変わっては困る場合は
あらかじめコピーしておくのは理解しましたが、
strtokをネストして使う場合、(1)で必ずNULLになります。
strtokはネストでは使えないのでしょうか?
また、他に注意点があるのでしたら教えてください。

あと、C++では、strtokより便利なものはありますか?

char test1[] = "111,222,333";
char test2[] = "333,222,111";
char *p, *q;
int flag;

p = strtok(test1, ",");
while ( p != NULL ) {
flag = 0;
q = strtok(test2, ",");
while ( q != NULL ) {
if (0 == strcmp(p, q)) {
flag = 1;
break;
}
q = strtok( NULL, ",");
}
if (flag == 0) {
return 1;
}
p = strtok( NULL, ","); // <------- (1)ここで必ずNULL
}
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/13 17:47
この質問に対する回答は締め切られました。

回答良回答20pt

ANo.2 標準関数ではないですが、strtok_r()を使うといちおうネストは出来ます。

strtok()は#1の回答の理由で、使うべきでない関数とされていますので、別の方法を考えた方がいいです。
strtok()の代替手法はネットを検索すれば山ほど出てくるので、そちらを参照してください。
回答者:tokichim
種類:アドバイス
どんな人:経験者
自信:参考意見
回答日時:
08/05/13 22:03
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答良回答10pt

ANo.1 strtok は内部にこっそりデータを持っていて, 探索すべき文字列 (のアドレス) として NULL が与えられると, この「こっそり持っているデータ」を使って探索を継続します.
だから, このようにネストして使うことはできません.
回答者:Tacosan
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/13 18:39
この回答へのお礼この回答にお礼をつける(質問者のみ)