繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM