0

私はGCCコンパイラを使用しています。私のプログラムでは 3scanf秒を使用しましたが、実行中は 2 秒しか実行しませscanfん。1 をスキップするのはなぜscanfですか? それはelse条件を実行しているだけです。

#include <stdio.h>
int main()
{
    int h, c, t;
    printf("tensile");
    scanf("%d", &h);
    printf("tensile1");
    scanf("%d", &c);
    printf("tensile2");
    scanf("%d", &t);
    if( h > 50 && c > 0.7 && t > 5600)
        printf("HI");
    else
        printf("bye");
    return 0;
}
4

2 に答える 2

2

として定義cし、intそれを と比較しました0.7。問題を無視してもscanf、あまり意味がありません。変数ごとに、整数のみを保持するか、(場合によっては分数の) 実数を保持するかを決定します。整数の場合は、おそらくint. 実数の場合、おそらく が必要ですdouble。そしてscanf、変数の型に応じて、適切な形式を使用する必要があります。詳細については、scanfドキュメントを参照してください。

この"%d"形式でscanfは、単一の整数を読み取り (改行を含む空白をスキップした後)、停止します。入力が の場合、"12.34"を読み取り、変数に"12"格納して、 を入力ストリームに12残します。".34"後でscanfwithを呼び出すと"%d"、文字が表示されたときに失敗し'.'ます。浮動小数点形式のいずれかを使用して、タイプの変数を読み取り、 のdoubleような入力を許可し"12.34"ます。

scanf正常に読み取られたアイテムの数を示す結果、またはエラー表示を返します。その結果をテストして、不良データでやみくもに実行を続けるのではなく、プログラムがエラーを検出するようにする必要があります。

プログラムに入力した内容を正確に(つまり、コピーして貼り付けて)表示すると、質問に答えやすくなります。

変数の値と によって返された結果を出力すると、何が起こっているのかを理解するのscanfに役立ちます。または、デバッガーが利用可能な場合は、デバッガーで値を調べることができます。

注意すべき点:scanfは、入力構文エラー (たとえば、実数を探しているときに を入力した場合"foobar") で失敗を報告しますが、必ずしもオーバーフローを診断するとは限りません。1.0e99999999浮動小数点入力に対して入力した場合、動作はundefinedですscanfこの問題を回避する唯一の現実的な方法は、数値入力での使用を避けることです。(IMHO これは、C 標準が*scanf関数を定義する方法の欠陥です。)

浮動小数点比較は信頼できないことで有名です。cが浮動小数点変数の場合、値は 2 進浮動小数点では正確に表すことができないc > 0.7ため、true または false のいずれかになります。0.7

于 2013-01-27T20:57:26.900 に答える
1

変数 c のデータ型を float に変更し、%f を書式指定子として使用します。float 値を整数変数に提供しているため、スキップしています

于 2013-01-27T18:53:32.403 に答える