我在写一个需要
sprintf
函数的程序时遇到了这个问题snprintf
功能或sprintf_s
功能来规避这些风险int sprintf_s(char *_DstBuf, size_t _DstSize, const char *_Format, ...);
int snprintf(char *__restrict__ __stream, size_t __n, const char *__restrict__ __format, ...);
一开始以为
sprintf_s
函数是Windows库特有的,也以为snprintf
函数是POSIX特有的<stdio.h>
库中。
snprintf
和 sprintf_s
函数之间存在许多差异,特别是在它们的返回值和它们处理错误的方式上。
返回值(错误除外):
snprintf
返回如果忽略“大小”参数, 将 写入缓冲区的字符数。
sprintf_s
返回字符数actually written.
额外检查:
sprintf_s
函数还执行 snprintf
不执行的检查,包括。如果以下任一情况为真,则调用失败(并返回零):
%n
格式说明符。%s
格式说明符对应的任何参数都是空指针。snprintf
和sprintf_s
之间的主要区别是:
snprintf
在所有符合ISO C的平台上都可用,而功能sprintf_s
在大多数平台上不存在。 (大多数平台不执行标准的附件 K。)snprintf
将静默截断字符串,而函数 sprintf_s
将调用当前安装的 contraint handler 函数。sprintf_s
将执行额外的参数验证(例如检查 NULL
指针)并在这些验证失败时调用当前安装的约束处理函数。