将变参格式化到一个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] = '\0'; } 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] = '\0'; } 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