- ベストアンサー
strtokを使用したループ内でのstrtok
- C言語でstrtokを使用したプログラムを作成している際、for文内でのstrtokの使い方に問題があります。
- ループ内のstrtokで値が正しく代入されないため、2回目のループに進むことができません。
- 他の方はどのようなソースコードを作成しているのか、教えていただけないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
「b=strtok(a,".");」をやった瞬間、strは「abc+EOS」になります。この時点で、forの続きのstrtokは出来なくなります。 また、for文の中の「a=strtok(NULL,",\n")」は「b=strtok(a,".");」の続きのstrtokになります。 うまく動かすには、forループ用のstrは壊してはいけないし、forループが終わるまで、他のstrtokは行ってはいけません。 すると、以下のようなソースになります。 #include <stdio.h> #include <string.h> void main(void) { int i,j; char *str,*a[100],*b,*c; str="abc.def,ghi.jkl,mnopq.r,kkk.bbb"; for( i = 0,a[0] = strtok(str,",\n") ; (a[i]) && (i < 100) ; a[++i] = strtok(NULL,",\n")) {;} for( j = 0; j < i; j++) { b=strtok(a[j],"."); c=strtok(NULL,"."); printf("b=%s\n",b); printf("c=%s\n",c); } }
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
自力で分解する. そもそもなぜうまくいかないか, 理解できていますか?
お礼
tacosanさん ご回答ありがとうございます。 >そもそもなぜうまくいかないか, 理解できていますか? b=strtok(a,"."); を実施したため、 a=strtok(NULL,",\n") が正常に動作しないのではないか、という予想をしておりました。 しかし、WEBを調べても確信がもてなかったため、今回質問させていただきました。
- nora1962
- ベストアンサー率60% (431/717)
#include <stdio.h> #include <string.h> int main(){ char *str = "abc.def,ghi.jkl,mnopq.r,kkk.bbb"; char *a; a = strtok(str,",\n"); while( a != NULL ){ printf("%s\n",a ); a = strtok(NULL,","); } return 0; }
お礼
nora1962さん ご回答ありがとうございました。
お礼
chie65535さん ご回答ありがとうございました。 やはり、ループの中でstrtokを使用したことが問題だったのですね。。。 ソースまで添付いただきありがとうございました。 本当にたすかりました。