这个函数定义如下
int sprintf_s(char *buffer,size_t sizeOfBuffer,const char *format [,argument] ...
);
参数说明是这样的,第一个参数buffer是输出存储位置,第二个参数sizeOfBuffer是最大允许的字符数。
下面通过代码简单探究一下这个函数的应用,如果以后有更好的例子会持续更新
void FormatMyStr()
{// 注意这里规定的格式是后边的格式样式,即后边123则为%d,后边为"123"则为%s// 同理,规定占位及左右对其,保留位数也是规定后边参数的// 这里发现我sprintf_s设置的buff_size参数502一口气走下去会报堆栈溢出错误,这里官方的解释为最大允许的字符数,因此还是不要超过字符串的大小了,不然会出问题using namespace std;string strTest = "23";char strTest2[128] = { 0 };memset(strTest2, 0, 128);/* 赋值成为"123" */sprintf_s(strTest2, 128, "%d", 123);/* 将"23"复制过去 */sprintf_s(strTest2, 130, "%s", strTest.c_str());/* 占4位,右对齐。输出为" 23" */sprintf_s(strTest2, 128, "%4s", strTest.c_str());/* 占四位,右对齐,空的部分以0补位。输出为"0023"*/sprintf_s(strTest2,128, "%04s", strTest.c_str());/* 保留4位小数,没有四舍五入 */sprintf_s(strTest2, 128, "%.4f", 1.23456789);/* 占8位,保留4位小数,右对齐,想左对齐可以设置为%-8.4f */sprintf_s(strTest2, 128, "%8.4f", 1.23456789);/* 前面的操作会丢失之前存入的数据,这样可以保留strTest2之前的数据,注意不要颠倒顺序 */sprintf_s(strTest2, 128, "%s%s",strTest2,"23");/* 大写的右对齐16进制格式化 */sprintf_s(strTest2, 128, "%08X", "23");/* 通过这种方法可以取固定小数位,且支持四舍五入,但是想转回去好像又是一个麻烦事直接利用atof发现会出点问题并没有按想象中原样转过去。所以建议放大1000倍,用atoi转过去之后再还原过去吧。。 */stringstream ss;ss << setiosflags(ios::fixed) << setprecision(3) << 1.654887521;ss >> strTest;return;
}