2

我的代码是这样的:

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 键,我想退出循环。

4

3 回答 3

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

如果您希望在用户按下回车时退出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()以及每个参数的含义,请查看其手册页

于 2013-11-09T08:30:01.280 回答
0

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

于 2013-11-09T07:58:42.827 回答