当前位置: 首页 > news >正文

如何在绝对标准的C编译器和系统(比如DOS)写出无阻塞输入

一般来说,无阻塞输入指在输入时,接收输入的程序可以执行其他操作,不会等待或有固定等待时间,比如玩游戏时,哪怕你没按任何键,敌人也会动,一般而言,用C标准库做这样的输入几乎不可能,但是我们看看:在用户没有输入时,程序要知道用户没输入,也就不移动玩家,再考虑NPC,所以我们只需让程序知道用户没按键,但输入就会卡住程序,读到输入就返回,能不能卡一个输入流的BUG呢?
你看,虽然C默认IO先存在缓冲区,但在取消缓冲区后,输入流也可看作缓冲区,因为不调用输入函数,输入流里的东西不会直接被读,但是只要调用一次,就立刻会被读取,除非里面没东西,输入函数会等待。
虽然输入流里的东西来自键盘或命令行,但也不是不能写进去,比如stdio.h里的ungetc(),该函数会将作为其中一个参数的字符写进缓冲区,该字符会被优先读取,除非在读取前有输入,看懂了吗?如果在读取前将一个一般用户无法输在命令行的字符写入输入流,读的时候,如果返回这个字,说明用户没按任何键;若不返回这个字而是其他字,说明用户键入了(重定向不算),如此,至少解决了阻塞输入卡住的问题,因为每一次都会读一个字符。
由于我们规定系统是绝对标准的,所以使用setvbuf(stdin,NULL,_IONBF,0);后应保证取消缓冲区,而linux发行版在该调用后不会取消命令行缓冲区,所以请修改相关设置。
代码示例:
#include <stdio.h>
int nbfin(void){
char a;
setvbuf(stdin,NULL,_IONBF,0);
ungetc(‘\0’,stdin);
a=getchar();
if(a==‘\0’)
return -2;
return a;
}

http://www.jsqmd.com/news/1318973/

相关文章:

  • Godot引擎GDScript反编译实战:从PCK/APK恢复源码的完整指南
  • 邯郸拖车_邯郸高速汽车拖车_邯郸道路救援汽车救援搭电补胎24小时-悟空道路救援 - 滚动商讯
  • IPTV电视系统双机热备份解决方案—助力IPTV电视系统主机出现故障系统不间断稳定运行
  • 三款免费代码对比工具深度评测:WinMerge、Meld与Diffoscope实战指南
  • LAV Filters:Windows媒体播放的终极解码解决方案,5分钟快速上手指南
  • Apifox自动化测试实战:从零构建API一体化协作与质量保障体系
  • Vue Router重定向实战与权限控制方案
  • Unity内存碎片终极解决方案:ET框架ECS架构与对象池实践
  • 15分钟彻底告别英文界面:Android Studio中文语言包完全指南
  • 惠普打印机驱动下载与安装全攻略:从官网精准获取到彻底解决代码39错误
  • 全球文字显示难题的终极解决方案:Noto字体项目深度解析
  • 2026想选专业南京建邺区楼梯?哪家好一目了然! - 滚动商讯
  • 信息爆炸时代如何培养独立思考能力
  • 中心对称图形:概念、性质与应用解析
  • 拒绝云端黑箱!这个本地AI助理让你看清智能体的每一步操作
  • Unity角色移动优化:从Input.GetKey到GetAxis的丝滑手感实现
  • H5与Cocos Creator iframe通信实战:基于postMessage的完整指南
  • 生产环境Oracle表空间扩容实战:使用Toad for Oracle图形界面新增Datafile(ASM+OMF)
  • 洛阳企事业单位食堂厨具更新改造:关林后厨工程设备供货与安装一体化服务
  • 微信小程序横向滚动选中自动居中解决方案
  • 如何选择长久稳定的Minecraft服务器:从技术架构到社区生态的全面指南
  • 磁力链接聚合搜索终极指南:如何一键搜索23个资源站点?
  • 动漫资源编号系统解析与高清收藏指南
  • AI提示词优化系统:提升生成内容准确率的工程实践
  • 微信小程序分包加载全解析:从架构设计到性能优化实战
  • 西安怎么找靠谱的GEO优化服务商 - 滚动商讯
  • OpenClaw AI智能体开发框架:从入门到实战
  • Hadoop集群监控与管理工具全解析
  • 2026年人乳酸脱氢酶A(LDHA)ELISA试剂盒厂家严选指南 - geo交流
  • 订阅转API:Windows + Docker 部署 Sub2,接入 Codex 与 Claude Code