• 将变参格式化到一个string对象中


    该小程序演示了变参的用法。它的功能是,仿照sprintf,将变参内容保存到string中。

    /*
    功能说明:
        仿照sprintf,将字符串格式化到一个string对象中。
    实现方式:
        该例子主要是用来演示变参的用法。
        使用变参的时候,需要头文件stdarg.h,其使用方式为:va_start(),vsprintf(),va_end()按照顺序的结合。
        程序调用vsprintf将变参格式化到该临时字符数组中,然后再将此临时字符数组中的数据复制到string对象中。
    限制条件或者存在的问题:
        程序在内存的堆中创建了一个临时字符数组,该字符数组的长度为2048个字节。
    */
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cstdarg>
    
    using namespace std;
    
    // 仿照sprintf,将字符串格式化到string中。
    void formatString(string & s, const char *format, ...)
    {
        size_t strMaxLen = 2048;
        char * tmp = new char[strMaxLen];
        memset(tmp, 0x00, strMaxLen);
        //为string赋值
        va_list list;
        va_start(list, format);
        //size_t len = vsnprintf(tmp, strMaxLen, format, list);
        size_t len = vsprintf(tmp, format, list);
        if (len >= strMaxLen)
        {
            tmp[strMaxLen - 1] = '';
        }
        va_end(list);
        s = tmp;
        delete[] tmp;
    }
    
    // 仿照sprintf,将字符串追加到string中。
    void appendString(string & s, const char *format, ...)
    {
        size_t strMaxLen = 2048;
        char * tmp = new char[strMaxLen];
        memset(tmp, 0x00, strMaxLen);
        //为string赋值
        va_list list;
        va_start(list, format);
        //size_t len = vsnprintf(tmp, strMaxLen, format, list);
        size_t len = vsprintf(tmp, format, list);
        if (len >= strMaxLen)
        {
            tmp[strMaxLen - 1] = '';
        }
        va_end(list);
        s.append(tmp);
        delete[] tmp;
    }
    
    int main(int argc, char **argv)
    {
        cout << "process begin at " << (void*)&main << endl;
    
        string str;
        cout << "strlen is " << str.length() << endl;
        formatString(str, "Hello, world: %d, %lf  %s", 435, 5462.56 / 54, "man");
        cout <<"after format:" <<str << endl;
        appendString(str, "|Hello, world: %d, %lf  %s", 435, 5462.56 / 54, "man");
        cout <<"after append:"<< str << endl;
    
        return 0;
    }

    输出的结果为:

    process begin at 01251541
    strlen is 0
    after format:Hello, world: 435, 101.158519  man
    after append:Hello, world: 435, 101.158519  man|Hello, world: 435, 101.158519  man

  • 相关阅读:
    线性代数基础知识的复习
    第一个机器学习算法:线性回归与梯度下降
    初识机器学习
    VScode中LeetCode插件无法登录的情况
    内存管理-内存管理功能
    分组密码
    Linux进程调度
    进程调度
    死锁
    临界区和缩
  • 原文地址:https://www.cnblogs.com/babyha/p/6443750.html
Copyright © 2020-2023  润新知