C语言中setvbuf设置标准输入流为无缓冲模式的正确用法
问题根源
你遇到的参数数量不足的编译报错,本质是调用setvbuf时既搞错了参数顺序,也没有按函数原型要求传够参数。C语言的标准库函数不支持参数缺省,哪怕某个参数在特定运行模式下会被完全忽略,也必须严格按声明的顺序、数量传值,编译器不会自动帮你补默认参数。
正确的
setvbuf调用规范 setvbuf的固定函数原型为:int setvbuf(FILE *stream, char *buffer, int mode, size_t size);
共4个必填参数,不同场景下的参数填写规则如下:
- 第一个参数
stream:指向要设置缓冲模式的文件流,你的场景中填stdin是正确的 - 第二个参数
buffer:指向用户自定义的缓冲区内存。当设置为无缓冲模式时,该参数会被运行时完全忽略,直接传NULL即可,不需要提前申请缓冲区空间 - 第三个参数
mode:指定流的缓冲模式,无缓冲模式需要传常量_IONBF——这也是你之前位置放错的参数,不能把这个模式值塞到第二个参数的位置 - 第四个参数
size:指定缓冲区的字节长度。无缓冲模式下该参数同样会被忽略,直接传0即可
对应你要实现的stdin无缓冲需求,正确的调用代码为:setvbuf(stdin, NULL, _IONBF, 0);
实用提示
- 无缓冲模式一旦设置成功就会对该流持续生效,你原代码中将
setvbuf放在while(1)循环内逐轮调用的逻辑完全没必要。把这行调用放到main函数的最开头,只执行一次即可,重复调用没有实际价值。 - 如果后续要给流设置全缓冲/行缓冲模式,才需要把第二个参数指向你自己申请的堆/栈缓冲区内存,同时把第四个参数传成缓冲区的实际长度,第三个参数分别对应传
_IOFBF(全缓冲)、_IOLBF(行缓冲)。
注意:无缓冲模式下被运行时忽略的参数,不代表可以在调用时省略,必须传够对应的值才能通过编译、正常运行。
内容的提问来源于stack exchange,提问作者Matthew Schell
相关产品推荐
相关产品推荐

