这里的一篇文章解释了我们许多人多年来都知道的差异。我的假设是:
-
sprintf
- 第一个字符"s"用于字符串类型的第一个参数。
- 最后一个字符"f"表示格式?
-
fprintf
- 第一个字符"f"用于字符串类型的第一个参数。
- 最后一个字符"f"表示格式?
-
printf
- 以"开头,没有第一个参数。
- 最后一个字符"f"表示格式?
我认为第一个字母是第一个论点,但vsprintf
和printf
否认这一说法。最后一个字母似乎意味着它需要一个格式。更不用说U's, N's, C's, V's和F's的其他用法了。
如果有人能给解释和源码来解释stdio
中所有这些约定背后的原因,那就太棒了。
-
这不是您需要查看的第一个字符,而是前缀。
"原始"功能,printf
用于格式化打印。然后可以向printf
名称添加一个或多个前缀:
-
f
:打印到FILE
-
s
:打印成字符串 -
v
: print withva_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
的宽字符格式化打印为字符串
前缀:
-
N
-提供了一个安全网络来限制它可以安全地读写的字符数量。 -
V
-你正在使用变量参数列表。如果你想编写模拟printf的函数,这是很有用的。 -
S
-你正在读取/写入一个字符串 -
F
-你正在读取/写入/到文件 -
P
-你正在读取进程的输出 -
None
- printf和scanf没有前缀,因为它们只是从标准输入/输出中读取/写入-在UNIX世界中,这些只是文件。
后缀:
-
F
-您正在以格式化输出的方式读写(您说您将使用后跟变量参数的格式字符串) -
C
-你每次处理一个字符。 -
S
-你正在处理字符串(数量几乎总是直到你到达下一个空白字符)。 -
W
-你处理的是单词(不要与英文单词混淆,word只是表示sizeof(int))