过滤的scanf导致无限循环

我通过scanf获得了一个程序过滤输入。 我想要只读数字和大字母+空格。

最近我试图做这样的事情,它陷入无限循环,仍然只打印第一个输入。 我知道fgets() ,但我知道这很有用。 我无法找出问题所在。 这是简化的情况; 我是怎么了?

 #include  #include  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) ,阅读后…

您的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 – 它与输入不匹配,那么它可能会粘在它的位置。