私のコードは次のようなものです:
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キーを押した場合、ループを終了したい。
pはポインターではありませんが、NULL(通常は) ゼロに相当します。したがって、この行は少し無意味です
if(p == NULL) { break; }scanfhttp://linux.die.net/man/3/scanfのマニュアルページを読んでください。確認する必要がある値を返しますユーザーが 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 ページを参照してください。
ここでユーザーが Enter キーを押したときに、p変数が に変わるとは限りませんNULL。ループを終了するには、特定の数字または文字を取得してみてください。関数はユーザーが何かを入力するまで待機するだけでscanfなく、値を入力せずにEnterキーを押してもプログラムは続行しません。