这段用于清空C语言输入缓冲区的代码是如何工作的?
代码功能说明
这段C语言代码的作用是清空标准输入缓冲区(stdin)中残留的未读字符,通常用于解决scanf等输入操作后,缓冲区残留的多余字符、换行符导致后续读输入出错的问题。
代码逐段拆解
do{ fgets(string,LENGTH,stdin); } while (strlen(string) > 0 && string[strlen(string) - 1] != '\n');
- 外层用
do...while循环:这种循环的特性是先执行一次循环体内容,再判断循环条件,刚好匹配我们要先读取缓冲区内容的需求。 - 循环体内的
fgets(string, LENGTH, stdin):从标准输入缓冲区中读取最多LENGTH-1个字符存入string数组,遇到换行符\n或者文件结束标记(EOF)就会停止读取,读取到的内容末尾会自动补上字符串结束符\0。 - 循环判断条件
strlen(string) > 0 && string[strlen(string) - 1] != '\n':strlen(string) > 0是前置校验,避免读取内容为空时,后面取下标-1出现越界错误string[strlen(string) - 1] != '\n'是核心判断逻辑:输入缓冲区的残留内容,最终都会以你输入时敲的回车对应的\n作为结尾,只要这次读取到的内容最后一个字符不是\n,就说明缓冲区还有剩余内容没读完,需要继续循环读取。
实际运行示例
假设你之前用scanf("%d", &num)输入了123hello\n,scanf只会读取数字123,缓冲区会残留hello\n:
- 第一次进入循环执行
fgets,如果LENGTH设为10,一次就读到了全部残留内容hello\n,判断最后一个字符是\n,循环直接退出,缓冲区被清空。 - 如果
LENGTH设为3,第一次fgets只读2个字符,得到he,最后一个字符是e不是\n,继续循环;第二次读ll,同样不符合退出条件,继续循环;第三次读o\n,最后一个字符是\n,循环退出,缓冲区也被清空。
注意:如果执行这段代码时缓冲区本来就是空的,
fgets会进入阻塞状态等待用户输入,所以建议只在确定缓冲区有残留内容的场景下调用。
内容的提问来源于stack exchange,提问作者Gio Bur
相关产品推荐
相关产品推荐

