• ベストアンサー

関数の値(scanf)

初心者なもので、言葉の使い方を間違っていたら申し訳ありません。いいたいことが伝わればよいのですが…。 scanfに関して疑問に思ったことがあります。経験的なことなので、正しいかわからないです。次の(1)と(2)から(3)のことが正しいか教えてください。 (1) int a; do{ printf("整数を入力してください\n"); }while(scanf("%d",&a) ==0); printf("入力した数は、%dです",a) このとき、「(いかなる整数)+(ENTER)」を入力しても、do~whileのループを抜け出す。 (2)また、上のプログラムで、継続条件式の中身を  … }while(scanf("%d",&a)!=0);  … とすると、「(いかなる整数)+(ENTER)」を入力してもループが抜け出せない。 (3)したがって(1)と(2)から、scanf()は入力するだけで、値を真(1)を返す。

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

scanfの返り値は、読み込みに成功した要素の個数です。 例えば、 > n = scanf("%d %d",&a,&b); で整数2つの読み込みに成功すれば nには2が入りますし、 1つも読み込めなければnには0が入ります。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/scanf.3.html
toudai_kamen
質問者

お礼

返り値のしくみがわかりました。 この例もとてもわかりやすいものです。 ありがとうございました!

すると、全ての回答が全文表示されます。

その他の回答 (1)

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

scanfが読み込みに成功したフィールド数を返すことは#1の通りです。 ただし、 (1)の「(いかなる整数)+(ENTER)」を入力しても、do~whileのループを抜け出す。 および (2)の「(いかなる整数)+(ENTER)」を入力してもループが抜け出せない。 が常に成り立つとは限りません。 というのは、%dは文字列を解釈してint型の値に変換するわけですが、文字列が表現している整数がINT_MIN~INT_MAXの範囲を超えていた場合、すなわちオーバーフローが発生した場合は動作が未定義になります。 未定義の動作が発生した結果、誤動作を引き起こしてscanfが0を返したとしてもおかしくはありません。 scanfは、よくバッファのオーバーフローを検出できないので危険という言い方をされますが、実際には読み込み可能な文字数を制限できますので、これについてはさほど問題ではありません。しかし、数値のオーバーフローは、制約を設けることも、エラーを検出することもできないので危険です。 これは、fgetsで一旦読み込んでから、sscanfを使った場合も同様です。

toudai_kamen
質問者

お礼

簡潔にありがとうございます。 範囲に気をつけて使うようにすれば変える値がそのようになるのがわかりました。

すると、全ての回答が全文表示されます。

専門家に質問してみよう