C-从整数var读取一个大的十进制输入后的无限循环



我是C的新手。我正在编写这个do while循环,但当我不小心在输入中输入小数/双精度时,它将进入一个无限循环。你能纠正我吗?非常感谢。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int items;
do {
printf("Input item quantity: ");
scanf("%d", &items);
if (items < 1 || items > 10)
printf("ERROR: It must between 1 - 10.n");
} while (items < 1 || items > 10);
return 0;

}

如果我尝试输入300.5,输出将变成循环

```
Input item quantity: ERROR: It must between 1 - 10.
Input item quantity: ERROR: It must between 1 - 10.
Input item quantity: ERROR: It must between 1 - 10.
```

scanf看到"."时,它停止扫描并将"."留在输入流中。您的程序在items中接收300,为此它打印消息并循环。循环的下一次迭代再次调用scanf。"."仍在输入流中,因此scanf在不更改items的情况下停止,并返回零以指示它分配了零个项目。您的程序没有检查scanf的返回结果,因此无法看到此信息。它只检查items的值,该值没有更改。

更改程序以检查scanf的返回值,并在返回值不是1(意味着分配了一个项目)时处理问题。要继续处理,您可能需要使用getchar或其他输入例程从输入中读取字符,直到看到一个新行字符,标记用户键入的行的末尾。

此外,即使分配了一个项目,您也可能希望阅读输入行的其余部分,看看用户是否输入了任何其他值得注意的字符,例如空格以外的任何字符。如果是这样,即使指定的值在范围内,您也可能希望报告错误。

要回答您关于逃离循环的评论,您可以查看以下链接:

清除扫描缓冲区

根据这个建议,我在代码中添加了一个catch-all整数变量。

int items, catchall; /* Added variable "catchall" */

然后,我附上了你的错误消息,并添加了与你的程序链接类似的代码。

if (items < 1 || items > 10)
{
printf("ERROR: It must between 1 - 10.n");
while ((catchall = getchar()) != 'n' && catchall != EOF) /* Clean up the buffer */
{}
}

这有效地清除了";scanf";缓冲区,这样你的程序就可以摆脱无休止的循环,而且我没有看到任何不希望的连锁反应。

希望能有所帮助。

谨致问候。

相关内容

  • 没有找到相关文章