• std::c++ 中格式化任意字符串


    //std::c++ 中没有Format 函数,但我们可以写一个,如下:

    #include
    #include
    #include
    using namespace std;

     ///
     // 向一块内存区格式化一个字符串,到底应该char[256],char[512],char[1024]?
     // 如果字符串更长怎么办 ?
     // 下面的 Format 函数就像printf 一样工作,但是不用操心字符串长度.
     // 采用了string 对象,不用操心内存分配了.
     ///
     
    /**
     * 格式化字符串
     * \param pszFmt 格式描述字符串, 后跟不定参数
     * \return 格式化的结果字符串,以string 对性返回
     */

    std::string Format(const char *pszFmt, ...)
    {
        va_list args;
        //获取字符串长度
        va_start(args, pszFmt);
    #define _PRINT_CAL_LENGTH
    #ifdef _PRINT_CAL_LENGTH    
        int nLength = vprintf(pszFmt, args); //会向屏幕输出字符串
    //虽然string 类字符串不需要包含尾部0,但vsnprintf要加上尾部字符串的0,所以长度加1
    //得到字符串长度有向屏幕输出打印信息, 进一步优化屏幕不应有输出!! 如何完成?
        nLength++;    
        //在栈中分配内存,并打印
        va_start(args, pszFmt);    //重新赋值args, 否则会有段错误
        std::vector chars(nLength);
        vsnprintf(chars.data(), nLength, pszFmt, args);
        va_end(args);
        //将结果付给str返回
        std::string str;
        str.assign(chars.data());
        return str;
    #else  // 如果不允许函数内向屏幕输出字符串,可给一个大缓冲输出
        //或者假定它不会超过1K
        char buffer[1024];
        vsnprintf(buffer,sizeof(buffer),pszFmt, args);
        //将结果付给str返回
        std::string str;
        str.assign(buffer);
        return str;
    #endif
    }

    // 用法举例:
    // Format: 像printf 一样工作,返回string 对象,支持任意复杂格式,任意长度字符串.
    int main()
    {
        string str;
        str=Format("%s\n","hello");
        cout << str;
        return 0;
    }

  • 相关阅读:
    从408改考自主命题,211贵州大学考研改考
    新版开源UI千月影视APP源码/后端基于ThinkPHP框架/前后端完美匹配
    docker安装mysql 8.0.20 版本 超详细教程
    给兄弟们更新一点干货,工作两年在外了解到的薪资待遇和技术
    测试用例逻辑梳理
    药品和药企信息接口
    [NOIP2007 提高组] 树网的核
    107. 二叉树的层序遍历 II
    Vue:从本地加载json文件
    Linux C 进程间通信
  • 原文地址:https://blog.csdn.net/hejinjing_tom_com/article/details/128025151