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的范围。