gpt4 book ai didi

c - scanf 忽略,无限循环

转载 作者:行者123 更新时间:2023-11-30 16:29:04 33 4
gpt4 key购买 nike

int flag = 0;
int price = 0;
while (flag==0)
{
printf("\nEnter Product price: ");
scanf("%d",&price);
if (price==0)
printf("input not valid\n");
else
flag=1;
}

当我输入有效数字时,循环按预期结束。但是,如果我输入的不是数字,例如 hello,那么代码就会进入无限循环。它只是不断打印输入产品价格:输入无效。但它不会等我输入新号码。这是为什么?

最佳答案

当您输入非数字的内容时,scanf 将失败并在输入中保留这些字符。因此,如果您输入 hello,scanf 将看到 h,将其拒绝为对十进制数无效,并将其保留在输入中。下一次循环时,scanf 将再次看到 h,因此它会永远循环。

此问题的一个解决方案是使用 fgets 读取整行输入,然后使用 sscanf 解析该行。这样,如果 sscanf 失败,输入中不会留下任何内容。用户必须输入新行供 fgets 读取。

大致如下:

char buffer[STRING_SIZE];
...
while(...) {
...
fgets(buffer, STRING_SIZE, stdin);
if ( sscanf(buffer, "%d", &price) == 1 )
break; // sscanf succeeded, end the loop
...
}

如果您只是按照另一个答案中的建议执行 getchar ,那么您可能会错过 \n 字符,以防用户在数字后输入某些内容(例如空格) ,可能后跟其他字符)。

您应该始终测试 sscanf 的返回值。它返回分配的转换次数,因此如果返回值与请求的转换次数不同,则意味着解析失败。在此示例中,请求了 1 次转换,因此成功时 sscanf 返回 1。

关于c - scanf 忽略,无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52068891/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com