• ベストアンサー

strtok関数の使い方

http://oshiete1.goo.ne.jp/kotaeru.php3?q=2361151 で、質問させて頂いた者です。 先日は大変にお世話になりました。 先日の質問の続きという感じなんですが… ------------------ 「ex」ファイルのデータ 41 4352 42 2341 43 5411 --------- これらのデータを kihokyu[1].tosi=41 kihokyu[1].kan=4352 kihokyu[2].tosi=42 kihokyu[2].kan=2341 という感じで格納したいのです。 ------------------------ 回答者の方にご指導して頂いたように、 ・ ・ ・ while(fgets(buff,sizeof buff,fp) != NULL){ if ( i > 50 ){ break; } kihokyu[i].tosi = atoi(strtok(buff , " ")); kihokyu[i].kan = atoi(strtok(NULL , " \n")); printf("%d\n",kihokyu[i].tosi); i++; } というstrtok関数を使ってみました。 ところが 41 42 43 と、表示されたあと 強制終了になってしまいます。 >kihokyu[i].kan = atoi(strtok(NULL , " \n")); を削除すると スムーズに処理が終了します。 >printf("%s\n",NULL); と、「NULL」の値を調べたところ 「{NULL}」と表示されました。 たぶん、strtok関数の使い方がおかしいと思うのですが ご教授して頂けたら幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

> たぶん、strtok関数の使い方がおかしいと思うのですが strtokの使い方はおかしくありません。たぶんstrtokに喰わせているデータの 問題でしょう。 atoi(strtok なんて横着せずに、strtokの戻り値のチェックをしてみては? #すでに言われていることですが。 > >printf("%s\n",NULL); > と、「NULL」の値を調べたところ > 「{NULL}」と表示されました。 何をしようとしてこのようなことを調べたのでしょうか? strtokの第一引数にNULL を渡したときの動作を理解していれば こんなことを調べるのは無駄だということだとわかると思うのですが。 どうせやるなら atoi(NULL)をやってみてほしかったですね #プログラムが落ちると思うのでやらないでいいです。 文字列→整数値の変換をするのなら、atoiなんて前時代的な関数を使わないで strtolを使いましょう。そうすればstrtokなんていうこれまたobsoleteな 関数を使う必要もなくなります。 最後に > ご教授して頂けたら幸いです。 「教示」です。

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strtok.html,http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtok.3.html
niiza
質問者

お礼

ご返事有り難うございました。 色々なご指摘 大変に参考になりました。 strtol関数は strtokが上手く行ってから 試してみたいと思います。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

43 5411\n [EOF] か 43 5411[EOF] の違いでfgets がデータがないのに空読みしている(ループに入ってしまう) というようなことじゃないでしょうか

niiza
質問者

お礼

ご返事有り難うございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

strtok の返り値を確認してみてください. strtok が NULL を返していて, それに対して atoi を呼出している可能性がありそうです.

niiza
質問者

お礼

ご返事有り難うございました。 ご指摘の通り 最後のレコードがnullでした。 有り難うございました。

関連するQ&A

専門家に質問してみよう