として定義c
し、int
それを と比較しました0.7
。問題を無視してもscanf
、あまり意味がありません。変数ごとに、整数のみを保持するか、(場合によっては分数の) 実数を保持するかを決定します。整数の場合は、おそらくint
. 実数の場合、おそらく が必要ですdouble
。そしてscanf
、変数の型に応じて、適切な形式を使用する必要があります。詳細については、scanf
ドキュメントを参照してください。
この"%d"
形式でscanf
は、単一の整数を読み取り (改行を含む空白をスキップした後)、停止します。入力が の場合、"12.34"
を読み取り、変数に"12"
格納して、 を入力ストリームに12
残します。".34"
後でscanf
withを呼び出すと"%d"
、文字が表示されたときに失敗し'.'
ます。浮動小数点形式のいずれかを使用して、タイプの変数を読み取り、 のdouble
ような入力を許可し"12.34"
ます。
scanf
正常に読み取られたアイテムの数を示す結果、またはエラー表示を返します。その結果をテストして、不良データでやみくもに実行を続けるのではなく、プログラムがエラーを検出するようにする必要があります。
プログラムに入力した内容を正確に(つまり、コピーして貼り付けて)表示すると、質問に答えやすくなります。
変数の値と によって返された結果を出力すると、何が起こっているのかを理解するのscanf
に役立ちます。または、デバッガーが利用可能な場合は、デバッガーで値を調べることができます。
注意すべき点:scanf
は、入力構文エラー (たとえば、実数を探しているときに を入力した場合"foobar"
) で失敗を報告しますが、必ずしもオーバーフローを診断するとは限りません。1.0e99999999
浮動小数点入力に対して入力した場合、動作はundefinedです。scanf
この問題を回避する唯一の現実的な方法は、数値入力での使用を避けることです。(IMHO これは、C 標準が*scanf
関数を定義する方法の欠陥です。)
浮動小数点比較は信頼できないことで有名です。c
が浮動小数点変数の場合、値は 2 進浮動小数点では正確に表すことができないc > 0.7
ため、true または false のいずれかになります。0.7