You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

这段用于清空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:

  1. 第一次进入循环执行fgets,如果LENGTH设为10,一次就读到了全部残留内容hello\n,判断最后一个字符是\n,循环直接退出,缓冲区被清空。
  2. 如果LENGTH设为3,第一次fgets只读2个字符,得到he,最后一个字符是e不是\n,继续循环;第二次读ll,同样不符合退出条件,继续循环;第三次读o\n,最后一个字符是\n,循环退出,缓冲区也被清空。

注意:如果执行这段代码时缓冲区本来就是空的,fgets会进入阻塞状态等待用户输入,所以建议只在确定缓冲区有残留内容的场景下调用。

内容的提问来源于stack exchange,提问作者Gio Bur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:06:03