sprintf_s的用法探究

这个函数定义如下

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;
}

猜你喜欢

转载自blog.csdn.net/lasuerte/article/details/80680580
今日推荐