アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になっております。
現在C言語で下記のようなstrtokを使用したプログラムを作成しております。
(関係なさそうな箇所については省略しております。)

【ソース】
str="abc.def,ghi.jkl,mnopq.r,kkk.bbb"
for( a=strtok(str,",\n") , a , a=strtok(NULL,",\n"){
b=strtok(a,".");
c=strtok(NULL,"."):
}

【質問内容】
上記の内容を使用したソースでは、for文のa=strtok(NULL,",\n")にてaに値がはいりません。
(2回目のループに行かない)
上記のような処理を実施したい場合、皆様どのようなソースを作成しているかご教示いただけないでしょうか。

よろしくお願いいたします。

A 回答 (3件)

#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;
}
    • good
    • 0
この回答へのお礼

nora1962さん

ご回答ありがとうございました。

お礼日時:2011/12/06 17:43

自力で分解する.



そもそもなぜうまくいかないか, 理解できていますか?
    • good
    • 0
この回答へのお礼

tacosanさん

ご回答ありがとうございます。

>そもそもなぜうまくいかないか, 理解できていますか?
b=strtok(a,".");
を実施したため、
a=strtok(NULL,",\n")
が正常に動作しないのではないか、という予想をしておりました。
しかし、WEBを調べても確信がもてなかったため、今回質問させていただきました。

お礼日時:2011/12/06 17:41

「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);
 }
}
    • good
    • 0
この回答へのお礼

chie65535さん

ご回答ありがとうございました。
やはり、ループの中でstrtokを使用したことが問題だったのですね。。。

ソースまで添付いただきありがとうございました。
本当にたすかりました。

お礼日時:2011/12/06 17:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!