我是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";缓冲区,这样你的程序就可以摆脱无休止的循环,而且我没有看到任何不希望的连锁反应。
希望能有所帮助。
谨致问候。