zoukankan      html  css  js  c++  java
  • 将变参格式化到一个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

  • 相关阅读:
    Head First Java pdf下载
    【ARC068F】Solitaire(dp,计数,思维)
    【BZOJ3270】博物馆(概率dp,高斯消元)
    【BZOJ3143】【HNOI2013】游走(期望dp,高斯消元)
    【BZOJ3622】已经没什么好害怕的了(dp,容斥原理,二项式反演)
    【BJWC2018】上学路线(dp,Lucas,crt)
    【BZOJ4987】Tree(树形dp)
    【SDOI201】黑白棋 /【XSY3064】小奇的博弈(博弈,nim,dp,组合数)
    【HNOI2017】礼物(FFT)
    【BZOJ2502】清理雪道(最大费用最大流)
  • 原文地址:https://www.cnblogs.com/babyha/p/6443750.html
Copyright © 2011-2022 走看看