1

我在一个程序中通过 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),阅读后......

4

2 回答 2

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);
于 2012-10-15T19:02:24.543 回答
0

取决于输入 - 但您可以检查 scanf 是否有效 - 它会返回匹配表达式的数量 - 因此在这种情况下应该是 1。如果它的 0 - 它与输入不匹配,那么它可能会粘在原来的位置。

于 2012-10-15T19:01:01.940 回答