admin管理员组文章数量:1122914
sprintf
一、函数原型
1、sprintf_s
int sprintf_s(
char *buffer,
size_t sizeOfBuffer,
const char *format[,argument]...);
int sprintf_s(
char (&buffer)[size],
const char *format[,argument]...);//C++only
2、_snprintf
int _snprintf(
char *buffer,
sizet_t count,
const char* format [,argument]...);
int _snprintf(
char (&buffer)[size],
sizet_t count,
const char* format [,argument]...);//C++ only
3、_snprintf_s
int _snprintf_s(
char *buffer,
size_t sizeOfBuffer,
sizet_t count,
const char* format [,argument]...);
int _snprintf_s(
char (&buffer)[size],
sizet_t count,
const char* format [,argument]...);//C++ only
二、_snprintf_s为何在sizeOfBuffer的基础上多添加一个count
_snprintf_s为何在sizeOfBuffer的基础上多添加一个count?count似乎是用来控制理想的宽度的。如果得到的字符串超过了count,于是会被截断到count的长度后面再加一个null-terminate。当然,更改的优先级还是sizeOfBuffer。如果应该输出的字符串大小达到了sizeOfBuffer,那么就溢出了,溢出情况下,函数把这个当成一个错误,会把buffer缓冲区置为一个空的字符串。而_snprintf_s的好处就是有了count参数,输出的字符串就算超过了count缓冲区得长度,仍然会有输出,输出字符串被截断到count大小,在这个大小的字符串后面加null-terminate当然如果count设置的和sizeOfBuffer一样大或者更大,就失去了作用。如果输出的字符串超过了sizeOfBuffer,缓冲区仍然被置为空字符串。因此希望缓冲区被尽量利用,可以将count参数设置为_TRUNCATE,这样实际效果是count=sizeOfBuffer-1.
三、sprintf_s与_snprintf
在C语言环境下,sprintf_s与_snprintf的对比,_snprintf使用的参数是count,而sprintf_s使用的sizeOfBuffer,这就很能说明问题。如果输出的字符串刚好达到count,那么字符串不能截断,调用_snprintf的时候需要注意返回值,如果返回值不是正数,那么还得注意你的字符缓冲区并不是null-terminate结尾的。总结来说,sprintf_s在缓冲区不够大时会失败,失败时缓冲区中是一个空字符串。_snprintf不会失败,但是如果缓冲区不够大,缓冲区得内容不是null-terminate,必须自己注意字符串的结束,而_snprintf_s结合了两者的优点。
本文标签: sprintf
版权声明:本文标题:sprintf 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1686910054a46782.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论