c - 这如何清除输入缓冲区?
问题描述
我发现这段代码清除了输入缓冲区,但我真的不明白它是如何工作的。任何人都可以用简单的方式解释它吗?
do{
fgets(string,LENGTH,stdin);
} while (strlen(string) > 0 && string[strlen(string) - 1] != '\n');
解决方案
说它“清除输入缓冲区”是用词不当。它所做的是前进到下一行 input。
代码是一个do
/while
循环。它假定一个名为的 char 数组string
至少LENGTH
在大小上。
循环的主体尽可能多地读取一行,最多LENGTH - 1
字符:
fgets(string,LENGTH,stdin);
from 的返回值fgets()
被忽略 - 这是一个错误,因为它可能意味着string
在失败情况下(例如 EOF)没有分配给它,我们可以永远循环。
循环条件检查我们是否已经读到了行尾。fgets()
有一个测试,字符串至少有一个字符(如果成功的话,它将),然后将最后一个字符与换行符进行比较:
while (strlen(string) > 0 && string[strlen(string) - 1] != '\n')
如果我们看到一个换行符,那么fgets()
已经阅读了该行的其余部分;如果没有,它会LENGTH-1
从较长的输入行读取字符,并且仍有输入要消耗,所以继续循环。
固定版本:
while (fgets(string, LENGTH, stdin) && string[strlen(string) - 1] != '\n')
;
更简单的选择:
scanf("%*[^\n]%*c");
请注意,在这两种情况下,任何流错误都将保留,以便在下次尝试输入时检测到。
推荐阅读
- java - 给定词典的缩写扩展器
- node.js - 在对话流聊天机器人中向用户键入通知
- javascript - JavaScript:对 ASCII 字符串和非 ASCII 字符串的混合数组进行排序
- javascript - FunctionDeclarations 返回什么?[漏洞?]
- android - 向 PDF 添加数字签名,使用远程服务器加载
- bit-manipulation - 在 C 中使用位运算符进行范围检查
- mysql - “无法加载身份验证插件'caching_sha2_password'。找不到特定模块”
- ios - ios按钮仅在点击时显示图像
- php - 在 PHP Server cpanel 中设置启动文件
- java - 使用属性和 excludeAttributes 为 SCIM apis 编辑 json 的通用解决方案