这个函数定义如下
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;
}