如果用户在未输入数据的情况下点击enter键,ANSI C将停止进程
我的代码是这样的:如果用户在未输入数据的情况下点击enter键,ANSI C将停止进程,c,scanf,C,Scanf,我的代码是这样的: double p, r = 12.40; while (r > 0) { printf("\nEnter a amount $: "); scanf("%lf", &p); if(p == NULL) { break; } r -= (p / 100); } break部件不工作。如果用户在没有输入任何金额的情况下点击enter键,我想退出,而循环。当用户在此处按下enter键时,p变量不一定会变为NULL。您应该尝试获取用于退出循环
double p, r = 12.40;
while (r > 0) {
printf("\nEnter a amount $: ");
scanf("%lf", &p);
if(p == NULL) { break; }
r -= (p / 100);
}
break
部件不工作。如果用户在没有输入任何金额的情况下点击enter键,我想退出,而循环。当用户在此处按下enter键时,p
变量不一定会变为NULL
。您应该尝试获取用于退出循环的特定数字或字符。除了scanf
功能等待用户输入内容之外,当您按enter键而不输入任何值时,程序不会继续
p
不是指针,但NULL
等于零(通常)。所以这句话有点毫无意义
if(p==NULL){break;}
请阅读scanf的手册页,即。它确实返回一个您需要检查的值
如果希望在用户按enter键时退出循环,scanf()
可能无法将控制权返回到循环,直到用户输入值(这称为阻塞)
您可以先使用fgets()
,然后将输入传递到scanf()
的相对值sscanf()
,以获得该%lf双精度值
正如@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()
以及每个参数是什么的详细信息,请查看其。使用此解决方案,无论我是否输入数字,break都有效。如果我输入一个数字并按enter键,它将运行r-=(p*100)然后退出循环。我不想那样。这不是循环的条件。循环应在r>0时继续,因为p乘以100,任何大于12的值都将退出,因为r从1240开始。我刚从你原来的帖子中听到这句话。对不起。我的错。它应该是r=12.40
和r-=(p/100)
(我刚刚修复了本文中的主代码),因此即使我输入20,循环也会存在。如果您在循环中打印变量,它可能会帮助您了解所有变量是如何工作的。在r-=行之后,尝试以下操作:printf(“r=%lf p=%lf\n”,r,p)代码>