質問 |
||
| 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 |
|
| |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |