该小程序演示了变参的用法。它的功能是,仿照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 = ;
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 - ] = '\0';
}
va_end(list);
s = tmp;
delete[] tmp;
} // 仿照sprintf,将字符串追加到string中。
void appendString(string & s, const char *format, ...)
{
size_t strMaxLen = ;
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 - ] = '\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", , 5462.56 / , "man");
cout <<"after format:" <<str << endl;
appendString(str, "|Hello, world: %d, %lf %s", , 5462.56 / , "man");
cout <<"after append:"<< str << endl; return ;
}

输出的结果为:

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

将变参格式化到一个string对象中的更多相关文章

  1. js String对象中常用方法小结(字符串操作)

    1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码. strObj.charCodeAt(index) 说明: index将被处理字符的从零开始计数的编号.有效值为0到字符 ...

  2. String对象中常用的方法

    String对象中常用的方法   1.charCodeAt方法返回一个整数,代表指定位置字符的Unicode编码.strObj.charCodeAt(index)说明:index将被处理字符的从零开始 ...

  3. js 判断字符串是否包含某字符串,String对象中查找子字符,indexOf

    var Cts = "bblText";   if(Cts.indexOf("Text") > 0 ) {     alert('Cts中包含Text字符 ...

  4. 【Java面试题】15 String s="Hello"; s=s+“world!”;这两行代码执行后,原始的String对象中的内容到底变了没有?String与StringBuffer的超详细讲解!!!!!

    1.Java中哪些类是不能被继承的? 不能被继承的是那些用final关键字修饰的类.一般比较基本的类型或防止扩展类无意间破坏原来方法的实现的类型都应该是final的,在java中,System,Str ...

  5. 005 String s = "Hello";s = s + " world!";执行这两行代码执行后,原始的 String 对象中的内容到底变了没有?

    原始的String对象中的内容没有改变成“Hello world”. 1.原因 因为在Java中String类被设计成不可改变的类,所以String类的所有对象都是不可变的.第一句代码中,s(存储在栈 ...

  6. String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?

    没有.因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象.在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行 ...

  7. 声明一个set集合,使用HashSet类,来保存十个字符串信息,然后通过这个集合,然后使用iterator()方法,得到一个迭代器,遍历所有的集合中所有的字符串;然后拿出所有的字符串拼接到一个StringBuffer对象中,然后输出它的长度和具体内容; 验证集合的remove()、size()、contains()、isEmpty()等

    package com.lanxi.demo1_3; import java.util.HashSet; import java.util.Iterator; import java.util.Set ...

  8. String对象中常用的方法有哪些?

    1.length()字符串长度 String str="abc"; System.out.println(str.length()); //输出3 2.charAt()截取一个字符 ...

  9. 用于string对象中字符截取的几种函数总结——语法、参数意义及用途举例

    1. charAt():返回指定位置的字符. 语法:stringObject.charAt(index) 参数意义:index  必需,指字符在字符串中的下标.需要注意的是,字符串中第一个字符的下标是 ...

随机推荐

  1. 流量分析系统----讲解-echarts模拟迁移(结合china.js)

    百度 Echarts 地图->模拟迁徙,实现自动切换地图 小航哥注释: 1.本文主要是把模拟迁移的流程讲了一遍,讲的很好.具体实现参考航哥这篇随笔“流量分析系统----实现-echarts模拟迁 ...

  2. volume不能挂载mysql permission denied问题

    参考 把玩jenkins docker镜像遇到的volume权限问题 docker run -d -v /root/jenkins:/var/jenkins_home -u 0 -P --name j ...

  3. PHP下使用Redis消息队列发布微博

    phpRedisAdmin :github地址  图形化管理界面 git clone [url]https://github.com/ErikDubbelboer/phpRedisAdmin.git[ ...

  4. third application :Directions widget

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  5. 树莓派打造对话机器人 Python(转)

    工具列表 1. **树莓派**(型号不要求,本人使用的是3B) 2. **usb麦克风**(某宝有卖,我就不打广告了) 用来录音 3. **音响或者喇叭**(某宝也有卖) 用来播放 以上就是需要的工具 ...

  6. C语言:内存字节对齐详解

    转:http://blog.csdn.net/arethe/article/details/2548867 一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论 ...

  7. 2018.7.12训练赛 -G

    第二道水题 前边说了很多话,但就最后两段有用. 就是给你一个序列,然后你判断一下这个序列是不是递增的,是就输出yes,否则输出no. 所以以后不管题目看起来多长.多复杂,都要读一遍. 代码就不贴了.

  8. 创建Android守护进程(底层服务)【转】

    本文转载自:https://blog.csdn.net/myfriend0/article/details/80016739 创建Android守护进程(底层服务) 前言 Android底层服务,即运 ...

  9. java resources 红叉 Cannot change version of project facet Dynamic Web Module to 2.5

    在使用maven导入项目的时候,markers提示Cannot change version of project facet Dynamic Web Module to 2.5,不能将工程转换为2. ...

  10. Kubernetes TLS认证

    转自: https://mritd.me/2018/01/07/kubernetes-tls-bootstrapping-note/ 前段时间撸了一会 Kubernetes 官方文档,在查看 TLS ...