• ベストアンサー

scanfについて

いつもお世話になっております ------------------------ #include<stdio.h> #include<stdlib.h> int main(void){ int age , kyoku; char buff[16]; while(age){ printf("0で終了/年齢を入力して下さい"); scanf("%d",buff); age = atoi(buff); if( age == 0 ){ printf("終了します\n"); break; } ・ ・ ・ ------------------------ 上記のプログラムは、 年齢を入力させて もしも0だったら処理を終了させるという プログラムです。(つもり) scanfで入力された値を いったんバッファに蓄えて atoiで整数に変換させているつもりなんですが 例えば、「20」と入力しても ageの値が0、buffの値がエラーになってしまいます どこがおかしいのが ご教授して頂けたら幸いです。

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

  • ベストアンサー
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.5

うーむ、。 >scanf("%d",&age); 変な入力を与えない限り、こちらでも動くはずですが。。。。 >整数の時はポインタで指定すると いいえ。全ての場合に於いて、ポインタを渡します。 scanf("%s",buff) と書いても、ポインタが渡されています。 このあたりはどの教科書でも詳しく説明されているはずのところなので、読んでください。

その他の回答 (6)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.7

「20」と全角で入力するのであれば、どんな処理系を使っているのか知りませんが、仮に対応可能だとしても、少なくともロケールの設定が必要になると思います。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.6

No.2さんの回答 >整数値を読み込みたければ >scanf("%d",&age); >です。 >特に後者は暴走しやすいのでお勧めしませんが…… に質問者さんは >>scanf("%d",&age); >としたところ、 >仰ったように暴走してしまい >強制終了してしまいました。 と補足がありますが、No.2さんの言う暴走と、 質問者さんの「暴走してしまい強制終了してしまいました。」 は別の意味です。 No.2さんの言う暴走は、scanf("%d",&age);の入力時に数字以外を入力したときに、scanfがエラーになり、whileで繰り返し、whileから抜けることが出来なくなります、そのことをさして暴走と言っています。 プログラム的には正常に動いています。

  • galluda
  • ベストアンサー率35% (440/1242)
回答No.4

がると申します。 ちぃと横道で恐縮ですが。そもscanf自体、使うことはまったくお勧めできません。 業務であれば確実にNGを食らう関数になります。 fgetsという関数があるので、そちらを調べてみてください。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.3

キーボードから入力された数字を ・数字のままバッファに蓄えて、atoiで変換したい  →scanf("%s"・・略);age=atoi(略) ・scanfに整数値への変換も行わせたい  →scanf("%d", &age); なお、現状のプログラムではscanfの返り値チェック(エラーチェック)をしていないので、End-Of-Fileが入力されたりすると無限ループにはいるように思います。

niiza
質問者

補足

ご返事有り難うございました。 大変に参考になりました。 一つお伺いしたいのは…。 >なお、現状のプログラムではscanfの返り値チェック(エラーチェック)をしていないので、 >End-Of-Fileが入力されたりすると無限ループにはいるように思います。 「End-Of-Fileが入力されたりすると」 という意味がどういうことなのか 分からないのですが… お手数ですが ご教授して頂けたら幸いです。

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

scanfの指定が間違っています。 "%d"は「整数値」を読み込みます。 buffは「文字列」です。 文字列を読み込みたければ scanf("%s",buff); です。 整数値を読み込みたければ scanf("%d",&age); です。 特に後者は暴走しやすいのでお勧めしませんが……

niiza
質問者

補足

ご返事有り難うございました。 >scanf("%s",buff); としたところ上手く行きました。 >scanf("%d",&age); としたところ、 仰ったように暴走してしまい 強制終了してしまいました。 ということは 数値(少数を含め)を入力するときは いったん文字列のバッファに蓄えて それから数値に変換しないと いけないということですか? もう一つお伺いしたいのは、 >scanf("%d",age); と、実数で指定したところ 上手く行きませんでした。 これは、scanfの場合 整数の時はポインタで指定すると 考えて良いのでしょうか?

回答No.1

>scanf("%d",buff); の%dを%sにしてどうなるか?

niiza
質問者

お礼

ご返事有り難うございました。 文字型にしないといけなかったんですね

関連するQ&A