2

私のコードは次のようなものです:

double p, r = 12.40;

while (r > 0) {
   printf("\nEnter a amount $: ");
   scanf("%lf", &p);
   if(p == NULL) { break; }
   r -= (p / 100);
}

そのbreak部分は機能しません。whileユーザーが金額を入力せずにEnterキーを押した場合、ループを終了したい。

4

3 に答える 3

3
  1. pはポインターではありませんが、NULL(通常は) ゼロに相当します。したがって、この行は少し無意味です if(p == NULL) { break; }
  2. scanfhttp://linux.die.net/man/3/scanfのマニュアルページを読んでください。確認する必要がある値を返します
于 2013-11-09T07:59:08.373 に答える
3

ユーザーが Enter キーを押したときにループを終了させたい場合、ユーザーがscanf()値を入力するまで制御をループに戻さない可能性があります (これはブロッキングと呼ばれます)。

最初にを使用fgets()してから、入力をscanf()の相対に渡して、sscanf()その %lf double 値を取得できます。

@EdHeal が指摘しているように、scanf() には確認が必要な戻り値があります。正常に変換されたものの数、または特別な値 EOF を返します。これは、読み取るデータがこれ以上ないことを意味します。からのこの戻り値はsscanf()、ユーザーが値を入力したかどうかを知らせます。

したがって、すべてをまとめると、次のようになります。

int main ()
{
    double p, r = 1240;
    char line[120];

    while (r > 0) {
        printf("\nEnter a amount $: ");

        fgets(line, 120, stdin); 
        int scanned = sscanf(line, "%lf", &p);

        if(scanned==0 || scanned==EOF) break;

        r -= (p *100);
    }

    return 0;
}

fgets()各パラメーターの詳細と内容については、 man ページを参照してください。

于 2013-11-09T08:30:01.280 に答える
0

ここでユーザーが Enter キーを押したときに、p変数が に変わるとは限りませんNULL。ループを終了するには、特定の数字または文字を取得してみてください。関数はユーザーが何かを入力するまで待機するだけでscanfなく、値を入力せずにEnterキーを押してもプログラムは続行しません。

于 2013-11-09T07:58:42.827 に答える