c - 如果用户在未输入数据的情况下按回车键,ANSI C 将停止进程

标签 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 循环。

最佳答案

如果您希望循环在用户按下 enter 时退出,scanf() 可能不会将控制权返回给您的循环,直到用户输入一个值(这称为阻塞)。

可以先使用fgets(),然后将输入传给scanf()的亲戚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() 的更多信息以及每个参数是什么,请查看其 man page .

关于c - 如果用户在未输入数据的情况下按回车键,ANSI C 将停止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19873721/

相关文章:

c++ - 关于在何处在线学习 C 以准备学习 Objective-C 的任何建议

c - 如何使用C逐行读取txt文件(int,未知长度)?

c - 为什么 sscanf 没有读取任何内容

c - _TP_POOL 结构的定义在哪里?

fork 和(失败的)exec 后 C 文件指针发生变化

c - main() 和 int main() 有什么区别?

c - 强制用户以特定格式编写输入

c - 整数赋值中的舍入误差

c - 而 scanf!=EOF 或 scanf==1?

C - 多个子级 - 信号相互覆盖