• ベストアンサー

小数を入力すると、処理が止まらない

変数kyoriには整数を入力されることを想定しています。 なので、整数の場合は問題なく動くのですが、 小数を入力すると、 処理が止まらなくなるという現象が起こってしまいます。 このようなことはどのようにしたら 防ぐことが出ますか? --------------- main(void) { int kyori,untin; while(kyori != 0){ printf("距離を入力してください->"); scanf("%d", &kyori ); ・ ・処理 ・ 処理終了 ---------------

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

  • ベストアンサー
noname#168973
noname#168973
回答No.4

どのように止らなくなりますか? 多分、"距離を入力してください->" が ダー っと流れる感じでしょうか? もしそうなら、それは整数や少数とかの問題ではなく、おそらく scanf() の問題でしょう。試しに整数以外に文字を入れても同じになるのでは? scanf() は色々癖があって非常に使いにくいものです(今までにも何度も質問にでてきています)。で、本来なら一切使わないほうが良い(標準ライブラリから抹消しても良いくらい)と思うのですが、なぜか、初心者向けの解説や、学校での課題等では未だに scanf() を教えているのですね。困ったものです ^^) で、本題ですが もし デバッガーが使えるのなら、各 step を順に追ってみましょう。特に scanf() の前後。小数を入れた後、次回の scanf() で 入力待ち状態になりますか? また、scanf()後、kyori には何が入ってますか? デバッガーが使えないなら、scanf() の前後に printf() などを入れて、工夫して確認してみてください。 あと、最後に、件のプログラムでは潜在的な不具合がありますよ。ヒントは、最初に while で判断するとき、kyori は幾らですか? この不具合の秘孔を突かれたとき、今度は止らないのではなく、すぐに止ってしまうでしょう ^^)

kawa214
質問者

お礼

wohaokeleさんのご指摘、本当に参考になりました。 >多分、"距離を入力してください->" が ダー っと流れる感じでしょうか? ハイ、そうです。 文字も同じでした。 >デバッガーが使えないなら、 >scanf() の前後に printf() などを入れて、 >工夫して確認してみてください。 早速、試してみました。 小数は整数に(1.2→→1)、 文字も6桁ぐらいの数値になっていました。 >あと、最後に、件のプログラムでは潜在的な不具合がありますよ。 kyoriに初期値を設定しないといけないと言うことですよね?

その他の回答 (6)

回答No.7

No.1,5様の補足 「gets()」は領域破壊の恐れがあり、使用はあまりお勧めできませんので、No.1時にもあります「fgets()」の使用をお勧めします。 gets(buff); → fgets(buff, sizeof(buff), stdin);

kawa214
質問者

お礼

ご返事有り難うございました。 大変に参考になりました。

noname#168973
noname#168973
回答No.6

#4 です。 > wohaokeleさんのご指摘、本当に参考になりました。 そうですか。それは良かったです。 解決したかどうかは判りませんが、糸口はつかめたようですね。がんばってください。 > kyoriに初期値を設定しないといけないと言うことですよね? そうですね。でも、だからといって kyori に初期値を設定するのはあまり良い答えじゃありませんよ。だって何で初期化しますか? もしかして 1? ^^)

kawa214
質問者

お礼

ご返事有り難うございました。 大変に参考になりました。

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

>どの様に書けばいいのか #include <stdio.h> #include <stdlib.h> … char buff[16]; … gets(buff); kyori=atoi(buff); …

kawa214
質問者

お礼

ご返事有り難うございました。 大変に参考になりました。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.3

ANo.2 です。失礼しました。 kyori は int だったのですね。

kawa214
質問者

お礼

いえいえ、とんでもないです。 大変に参考になりました。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

計算機の世界は数学の世界と違い、計算結果が厳密な値にはなりません。 したがって、なんらかの演算を行った結果が0になると思っていても、非常に小さな計算誤差があり、厳密には0にならないことが多いのです。 解決策です。 計算誤差の許容範囲を決めて、これを終了条件に入れましょう。 例えば、 #define EPSILON 0.0001 /* 許容計算誤差 */ (中略) while( EPSILON > fabs(kyori) ){ という感じです。

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

scanfでいきなり入力するのではなくていったん getsやfgetsで一行入力として受ける。 その後sscanfするか 単にatoiする

kawa214
質問者

補足

ご返事有り難うございました。 >scanfでいきなり入力するのではなくていったん >getsやfgetsで一行入力として受ける。 >その後sscanfするか >単にatoiする そうなんですね。 出来ましたら どの様に書けばいいのか 教えて頂けませんか?

関連するQ&A