过滤的scanf导致无限循环

时间:2012-10-15 18:56:47

标签: c scanf

我通过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)

2 个答案:

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