导致无限循环的过滤扫描 [英] Filtered scanf causing infinite loop

查看:17
本文介绍了导致无限循环的过滤扫描的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

最近我试图做这样的事情,它陷入了无限循环,仍然只打印第一个输入。 我知道fgets(),但我知道这是有效的。 我找不到问题出在哪里。 这是简化的情况;我发生了什么事?

#include <stdio.h>
#include <string.h>

int main()
{
  char str[21];

  do
  {
    scanf("%20[0-9A-Z ]", str);
    printf("%s
", 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
", str);
  while((c = getchar()) != '
' && c != EOF); // clear input buffer
} while(c != EOF && strcmp("END", str) != 0);

这篇关于导致无限循环的过滤扫描的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆