[英]What parameters for setvbuf perform the same action as setbuf(stdin, NULL) did?
我有在这里问的问题。
最佳答案有两个建议,其中之一(被认为更可靠)是使用setbuf(stdin, NULL);
. 但是, 不推荐使用setbuf()
函数, 替换函数为setvbuf()
。 我不确定如何以复制旧函数的方式使用这个新函数的参数; 我该怎么做呢?
背景:当我在循环中使用getchar()
,循环的第二次迭代总是接下来读取 '\\n' 字符,我想摆脱它。
在回答您提出的问题时,最好的setvbuf
相当于
setbuf(stdin, NULL);
应该
setvbuf(stdin, NULL, _IONBF, 0);
然而,与您链接的文档中的说明相反,我不知道setbuf
已被弃用,而且我不知道使用它有任何不利因素。
而且,正如我在评论中提到的,如果您想禁用缓冲的原因是解决scanf
倾向于在“缓冲区中”留下换行符从而导致以后出现问题的问题的解决方法,我会说完全禁用缓冲是一个特别的问题解决这个问题的糟糕方法。
联机帮助页说明了这一点(为便于理解向setbuf
添加了参数):
其他三个调用实际上只是调用
setvbuf()
别名。setbuf(FILE *stream, char *buf)
函数完全等同于调用setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);
因此,您的电话相当于:
setvbuf(stream, NULL, _IONBF, BUFSIZ);
因为NULL
是 false 。
但是,在使用getchar
的循环中避免\\n
的更简单方法是简单地执行以下操作:
int c;
while((c = getchar()) != EOF)
{
if(c == '\n')
continue;
/* use c as a character */
}
我还想指出setbuf
没有被弃用。 作为一般规则,在 Windows 中存在于 POSIX 中而不是在 ANSI C 标准中的所有不以下划线开头的函数在 Microsoft 眼中都是“弃用”的。 但是,如果您使用带下划线前缀的版本,您的代码将不可移植。 什么兔子洞。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.