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

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