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”用于格式?
我认为第一个字母是第一个参数,但 vsprintf
和 printf
否认这一说法。最后一个字母似乎意味着它需要一种格式。更不用说 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)swprintf
和 vswprintf
也“具有给定数量的字符”,即使它们缺少 n
。 2)考虑A-Z排序。 (printf
除外)以上是关于stdio 函数(sprintf、vsprintf 和 fprintf)背后的命名约定是啥?的主要内容,如果未能解决你的问题,请参考以下文章
printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - 输出格式转换
C语言printf()sprintf()vsprintf() 的区别与联系