我的代码是这样的:
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。它确实返回一个您需要检查的值如果您希望在用户按下回车时退出scanf()
循环,则在用户输入值之前可能不会将控制权返回给您的循环(这称为阻塞)。
您可以fgets()
先使用,然后将输入传递给scanf()
's relative,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()
以及每个参数的含义,请查看其手册页。
当用户在此处按 enter 时,p
变量不一定会更改为NULL
. 您应该尝试获取特定的数字或字符以退出循环。除了scanf
函数会一直等到用户输入某些内容,当您在不输入任何值的情况下按 Enter 时,程序不会继续。