使用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,提问作者黑魔仙大帝
相关产品推荐
相关产品推荐

