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

使用fprintf写入stdin无效?scanf读取失败及stdin相关疑问

问题解答

1. 是的,fprintf(stdin, ...)完全无效,甚至属于未定义行为

stdin是标准输入流,默认处于只读模式。C标准明确规定,向只读流执行写入操作属于未定义行为——不同系统可能出现不同结果,但绝对不会把你写入的内容放到scanf能读取的输入缓冲区里,这就是程序仍需手动输入的原因。

2. stdin到底是什么?

stdin是C标准库预定义的FILE*类型指针,指向标准输入流这个抽象接口:

  • 它是程序默认的输入来源,默认关联到用户的键盘(可通过输入重定向改为文件、管道等其他输入源)。
  • 它不是简单的内存缓冲区,而是封装了底层输入设备(或文件)的操作逻辑,包括缓冲管理、数据读取等功能。

3. 键盘输入如何进入输入缓冲区?

整个流程分两步:

  • 操作系统级缓冲区:当你在键盘按键时,操作系统的键盘驱动会捕获按键事件,将其转换为对应字符编码(如ASCII),暂存到操作系统的键盘输入缓冲区。只有当你按下回车键时,操作系统才会把整行数据提交给程序的输入流。
  • C标准库用户级缓冲区:当程序调用scanf、getchar这类输入函数时,C标准库会先检查自身维护的用户级输入缓冲区是否有数据。如果没有,就会从操作系统的输入缓冲区读取一批数据到用户级缓冲区,之后程序的输入函数就从这个用户级缓冲区取数据。

你的代码里的其他问题

  • printf("%s", stdin); 完全错误:%s格式符要求传入char*类型的字符串指针,但stdin是FILE*类型指针。直接打印会把stdin的指针地址当作字符串首地址访问内存,属于非法内存访问,因此出现乱码。
  • 如果想让程序自动读取预设的"100 1010",可以用输入重定向:比如把内容写到input.txt文件里,运行程序时用./your_program < input.txt,这样stdin就会从文件读取数据,无需手动输入。

内容的提问来源于stack exchange,提问作者黑魔仙大帝

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:24:59