我有被问到的问题here。
最高答案有两个建议,其中一个(被认为稍微更可靠)是使用setbuf(stdin, NULL);
。但是,setbuf()
功能is deprecated和replacement function is setvbuf()
。我不确定如何以复制旧功能的方式将参数用于此新功能。我该怎么做?
[背景:当我在循环中使用setvbuf()
时,循环的第二次迭代总是读取下一个'\ n'字符,而我想摆脱它。
为回答您所陈述的问题,最好的getchar()
等于
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
is false循环出现NULL
:
\n
[我也想指出,getchar
未弃用。作为一般规则,Microsoft认为“不赞成” POSIX中存在的,不是Windows中以下划线开头的所有功能,也不是ANSI C标准中的所有功能。但是,如果使用下划线前缀的版本,则您的代码将不可移植。真是个兔子洞。