我通过scanf获得了一个程序过滤输入。 我想要只读数字和大字母+空格。
最近我试图做这样的事情,它陷入无限循环,仍然只打印第一个输入。 我知道fgets()
,但我知道这很有用。 我无法找出问题所在。 这是简化的情况; 我是怎么了?
#include #include int main() { char str[21]; do { scanf("%20[0-9A-Z ]", str); printf("%sn", 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("%sn", str); while((c = getchar()) != 'n' && c != EOF); // clear input buffer } while(c != EOF && strcmp("END", str) != 0);
取决于输入 – 但你可以检查scanf是否工作 – 它将返回匹配表达式的数量 – 所以在这种情况下应该是1。 如果它的0 – 它与输入不匹配,那么它可能会粘在它的位置。
以上就是c/c++开发分享过滤的scanf导致无限循环相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549330.html