私のコードは次のようなものです:
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; }
scanf
http://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キーを押してもプログラムは続行しません。