导致无限循环的过滤扫描 [英] Filtered scanf causing infinite loop
本文介绍了导致无限循环的过滤扫描的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个程序通过scanf过滤输入。 我想要只读数字和大字母+空格。
最近我试图做这样的事情,它陷入了无限循环,仍然只打印第一个输入。
我知道fgets()
,但我知道这是有效的。
我找不到问题出在哪里。
这是简化的情况;我发生了什么事?
#include <stdio.h>
#include <string.h>
int main()
{
char str[21];
do
{
scanf("%20[0-9A-Z ]", str);
printf("%s
", str);
} while(strcmp("END", str) != 0);
return 0;
}
编辑:我忘了提了,输入是有效的,对于输入:"Hello"程序卡住.和scanf
只对第一个输入返回1,对于其他输入返回0。
我也试了fflush(stdin)
,看完后
推荐答案
您的scanf
只接受数字、大写字母(拉丁字母)和空格,
scanf("%20[0-9A-Z ]", str);
因此,当您输入任何其他内容时,scanf
无法将输入分配给str
,而有问题的输入仍保留在输入缓冲区中。您需要检查扫描是否成功,失败时清除输入缓冲区。
由于特定的换行符不在有效的输入标记中,如果输入来自例如键盘而不是不含换行符的输入流,则无论如何都需要清除输入缓冲区,直到下一个换行符。
int c;
do
{
scanf("%20[0-9A-Z ]", str);
printf("%s
", str);
while((c = getchar()) != '
' && c != EOF); // clear input buffer
} while(c != EOF && strcmp("END", str) != 0);
这篇关于导致无限循环的过滤扫描的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文