stdio 函数(sprintf、vsprintf 和 fprintf)背后的命名约定是啥?

Posted

技术标签:

【中文标题】stdio 函数(sprintf、vsprintf 和 fprintf)背后的命名约定是啥?【英文标题】:What is the naming convention behind stdio functions (sprintf, vsprintf and fprintf)?stdio 函数(sprintf、vsprintf 和 fprintf)背后的命名约定是什么? 【发布时间】:2017-02-28 07:26:34 【问题描述】:

一篇文章here 解释了我们许多人多年来都知道的差异。我的假设是:

sprintf 第一个字符“s”是字符串类型的第一个参数。 最后一个字符“f”用于格式? fprintf 第一个字符“f”用于字符串类型的第一个参数。 最后一个字符“f”用于格式? printf 以“”开头表示没有第一个参数。 最后一个字符“f”用于格式?

我认为第一个字母是第一个参数,但 vsprintfprintf 否认这一说法。最后一个字母似乎意味着它需要一种格式。更不用说 U、N、C、V 和 F 的所有其他用途了。

如果有人能给stdio 中所有这些约定背后的理性提供解释来源,那就太棒了。

奖金 - 获得额外的尊重。

【问题讨论】:

fprintf() 写入文件流。前导的f代表file。最后的f 真正代表formatted @pid 感谢您的评论。这些是我曾经有过的类似假设。我可能是错的,但我认为大多数人都同意他们的立场。我真的在寻找理性,例如“这是更大命名约定的一部分吗?”以及源材料,例如“谁写的?”。 【参考方案1】:

前缀:

    N - 提供一个安全网来限制它可以安全地写入/读取的字符数。

    V - 您正在使用可变参数列表。如果您想编写模拟 printf 的函数,这很有用。

    S - 您正在读取/写入字符串。

    F - 您正在读取/写入文件。

    P - 你正在读取进程的输出

    None - printf 和 scanf 没有前缀,因为它们只是从标准输入/输出中读取/写入 - 无论如何,在 UNIX 世界中它们只不过是文件。

后缀:

    F - 您正在根据格式化输出进行读写(您是说您将使用格式字符串后跟可变参数)

    C - 你一次只处理一个字符。

    S - 您正在处理字符串(数量几乎总是在您到达下一个空白字符之前)。

    W - 你在处理单词(不要把它和英文单词混淆,单词只是表示 sizeof(int))

【讨论】:

【参考方案2】:

您需要查看的不是第一个字符,而是前缀

“原始”功能,printf 用于格式化打印。然后可以将一个或多个前缀添加到 printf 名称:

f:打印到FILE s: 打印到字符串 v:用va_list打印 n:打印给定数量的字符 w:打印宽字符:

这给了我们:

printf:格式化打印到标准输出 fprintf:格式化打印到FILE sprintf: 格式化打印成字符串 snprintf: 格式化打印到给定字符数的字符串 vprintf:使用va_list 格式化打印到标准输出 vfprintf:使用va_list 格式化打印到FILE vsprintf:使用va_list 格式化打印到字符串 vsnprintf:使用va_list 格式化打印到具有给定字符数的字符串 wprintf:将宽字符格式化打印到标准输出 fwprintf:将宽字符格式化打印为FILE swprintf: 将宽字符格式化打印成字符串 vwprintf:将带有va_list的宽字符格式化打印到标准输出 vfwprintf:将带有va_list的宽字符格式化打印到FILE vswprintf:将带有va_list的宽字符格式化打印到字符串中

【讨论】:

别忘了 w: 宽。 :-) 1) swprintfvswprintf 也“具有给定数量的字符”,即使它们缺少 n。 2)考虑A-Z排序。 (printf除外)

以上是关于stdio 函数(sprintf、vsprintf 和 fprintf)背后的命名约定是啥?的主要内容,如果未能解决你的问题,请参考以下文章

printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - 输出格式转换

sprintf()函数的用法

printf,sprintf,vsprintf 区别

C语言printf()sprintf()vsprintf() 的区别与联系

print系列函数(formatted output conversion)

请教libevent的神奇函数bufferevent