setvbuf的哪些参数执行与setbuf(stdin,NULL)相同的操作?

问题描述 投票:0回答:1

我有被问到的问题here

最高答案有两个建议,其中一个(被认为稍微更可靠)是使用setbuf(stdin, NULL);。但是,setbuf()功能is deprecatedreplacement function is setvbuf()。我不确定如何以复制旧功能的方式将参数用于此新功能。我该怎么做?

[背景:当我在循环中使用setvbuf()时,循环的第二次迭代总是读取下一个'\ n'字符,而我想摆脱它。

c stdin deprecated
1个回答
1
投票

为回答您所陈述的问题,最好的getchar()等于

setvbuf

应该是

setbuf(stdin, NULL);

与您链接的文档中的注释相反,但是,我不知道setvbuf(stdin, NULL, _IONBF, 0); 已被弃用,并且我不知道使用它的任何不利因素。

[并且,正如我在评论中所提到的,如果您要禁用缓冲的原因是作为解决方法,即setbuf倾向于将换行符留在“缓冲中”,从而在以后引起问题,我会说禁用缓冲完全是解决该问题的一种特别差的方法。


1
投票

手册页对此进行了说明(为了便于理解,在scanf中添加了参数:]

其他三个调用实际上只是对setbuf的调用的别名。 setvbuf()功能与调用完全等效

setbuf(FILE *stream, char *buf)

因此,您的通话相当于:

setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

因为setvbuf(stream, NULL, _IONBF, BUFSIZ);

但是,更简单的方法是避免与NULL is false循环出现NULL

\n

[我也想指出,getchar未弃用。作为一般规则,Microsoft认为“不赞成” POSIX中存在的,不是Windows中以下划线开头的所有功能,也不是ANSI C标准中的所有功能。但是,如果使用下划线前缀的版本,则您的代码将不可移植。真是个兔子洞。

© www.soinside.com 2019 - 2024. All rights reserved.