我有在通过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;
}
编辑:我忘了提,输入是有效的,输入:“你好”节目卡......和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\n", str);
while((c = getchar()) != '\n' && c != EOF); // clear input buffer
} while(c != EOF && strcmp("END", str) != 0);
输入取决于一点 - 但你可以检查scanf函数的工作 - 它会返回匹配的表达式的数量 - 所以应该在这种情况下是1。 如果它的0 - 它不匹配输入,所以它可能会粘在哪里。