重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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関数の使い方がおかしいと思うのですが
ご教授して頂けたら幸いです。

A 回答 (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,h …
    • good
    • 0
この回答へのお礼

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

色々なご指摘
大変に参考になりました。

strtol関数は
strtokが上手く行ってから
試してみたいと思います。

お礼日時:2006/09/04 14:12

43 5411\n


[EOF]

43 5411[EOF]
の違いでfgets がデータがないのに空読みしている(ループに入ってしまう)
というようなことじゃないでしょうか
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/09/04 13:52

strtok の返り値を確認してみてください.


strtok が NULL を返していて, それに対して atoi を呼出している可能性がありそうです.
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2006/09/04 13:50

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

今、見られている記事はコレ!