如果用户在不输入数据的情况下进入输入,则ANSI C停止进程

时间:2013-11-09 07:54:41

标签: 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部分不起作用。我想退出while循环,如果用户点击进入而没有输入任何金额。

3 个答案:

答案 0 :(得分:3)

  1. p不是指针,但NULL等于零(通常)。所以这条线有点无意义 if(p == NULL) { break; }
  2. 阅读scanf的手册页 - 即http://linux.die.net/man/3/scanf。它确实返回了您需要检查的值

答案 1 :(得分:3)

如果您希望在用户按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()的详细信息以及每个参数的详细信息,请查看其man page

答案 2 :(得分:0)

当用户在此处按Enter键时,p变量不一定会更改为NULL。您应该尝试获取特定的数字或字符以退出循环。除了scanf函数等待用户输入内容之外,当您按Enter键而不输入任何值时,程序不会继续。