C 为什么fputs()不追加尾随的新行?
或同等地 为什么C 为什么fputs()不追加尾随的新行?,c,C,或同等地 为什么put()追加一个尾随的新行? 输出字符串时,可以使用两个类似的函数:fputs()和put() put()在输出时自动在末尾添加新行,但fputs()不会 这种不一致背后有什么原因吗?我的意思是,调用printf(fmtstr,…)和fprintf(stdout,fmtstr,…)具有相同的行为。为什么put(str)和fputs(str,stdout)也不应该是这种情况 这是因为向后兼容,还是有一个很好的理由让它们以这种方式实现?将写入标准输出,“每个人都知道”是面向行的终
put()
追加一个尾随的新行?
输出字符串时,可以使用两个类似的函数:
fputs()
和put()
put()
在输出时自动在末尾添加新行,但fputs()
不会
这种不一致背后有什么原因吗?我的意思是,调用printf(fmtstr,…)
和fprintf(stdout,fmtstr,…)
具有相同的行为。为什么put(str)
和fputs(str,stdout)
也不应该是这种情况
这是因为向后兼容,还是有一个很好的理由让它们以这种方式实现?
将写入标准输出,“每个人都知道”是面向行的终端,而fputs
可以写入一个没有这种内涵的文件。特别是,它比组合strlen
和fwrite
更方便
在get
(现在已弃用)和fgets
get()
和put()
之间保持的相同关系应该用于从终端进行简单的输入/输出,而fgets()
和fputs()
更通用,提供更精细的控制:您可以指定流,它们不执行任何隐式换行处理
遗憾的是,gets()
的指定很糟糕,为如此多的缓冲区溢出铺平了道路。它最终从最新的C标准中删除。我不知道。。。也许gets()
和fgets()
之间存在平行关系:“fputs()
将字符串s写入流,而不包含其终止的空字节('\0'
)。”换句话说,没有指定它添加新行。@JoachimPileborg我知道没有指定它添加新行。我在问为什么没有指定它这样做,而指定了put()
这样做。@为此,您必须询问函数的发明者。查看“良好”的参考站点(如或),我找不到背后的任何理由,我可以检查C11规范,但我怀疑我在那里会找到任何东西。我只想把它归结为“历史事实”。这是一个很好的问题,你可以问,我相信这种行为是有历史原因的,即使这是某个工程师的人为错误。然而,文档对此非常明确。一个更好的问题是,“为什么会发生这种事情?”但这将超出SO的范围。