我通过scanf获得了一个程序过滤输入。 我想要只读数字和大字母+空格。
最近我试图做类似的事情,它陷入无限循环,仍然只打印第一个输入。
我知道fgets()
,但我知道这很有效。
我无法找出问题所在。
这是简化的情况;我发生了什么事?
#include <stdio.h>
#include <string.h>
int main()
{
char str[21];
do
{
scanf("%20[0-9A-Z ]", str);
printf("%s\n", str);
} while(strcmp("END", str) != 0);
return 0;
}
编辑:我忘了提,输入有效,输入:“HELLO”程序卡住了... scanf
仅为第一次输入返回1,其他人返回0。
在阅读后我也尝试了fflush(stdin)
答案 0 :(得分:2)
您的scanf
只接受数字,大写字母(拉丁字母)和空格
scanf("%20[0-9A-Z ]", str);
因此,当您输入任何其他内容时,scanf
无法将输入分配给str
,并且有问题的输入仍保留在输入缓冲区中。您需要检查扫描是否成功并在失败时清除输入缓冲区。
并且因为特别是新行不在有效的输入令牌中,所以如果输入来自例如输入,则需要清除输入缓冲器直到下一个换行符。键盘而不是换行符的输入流。
int c;
do
{
scanf("%20[0-9A-Z ]", str);
printf("%s\n", str);
while((c = getchar()) != '\n' && c != EOF); // clear input buffer
} while(c != EOF && strcmp("END", str) != 0);
答案 1 :(得分:0)
取决于输入 - 但您可以检查scanf是否有效 - 它将返回匹配表达式的数量 - 因此在这种情况下应为1。 如果它的0 - 它与输入不匹配,那么它可能会粘在它的位置。