过滤scanf函数导致无限循环(Filtered scanf causing infinite lo

2019-09-24 03:40发布

我有在通过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) ,看完后...

Answer 1:

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);


Answer 2:

输入取决于一点 - 但你可以检查scanf函数的工作 - 它会返回匹配的表达式的数量 - 所以应该在这种情况下是1。 如果它的0 - 它不匹配输入,所以它可能会粘在哪里。



文章来源: Filtered scanf causing infinite loop
标签: c scanf