如果用户在未输入数据的情况下点击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)0时继续,因为p乘以100,任何大于12的值都将退出,因为r从1240开始。我刚从你原来的帖子中听到这句话。对不起。我的错。它应该是
    r=12.40
    r-=(p/100)
    (我刚刚修复了本文中的主代码),因此即使我输入20,循环也会存在。如果您在循环中打印变量,它可能会帮助您了解所有变量是如何工作的。在r-=行之后,尝试以下操作:
    printf(“r=%lf p=%lf\n”,r,p)