【C/C++】可变参数va_list与格式化输出

va_list与格式化输出

va_list

文章目录

  • va_list与格式化输出
    • va_list
    • 格式化输出
      • snprintf
      • vsnprintf
      • vasprintf
    • 实例

va_list是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个

用法:在函数里定义va_list 型的变量 ,这个变量是指向参数的指针 ,通过指针运算来调整访问的对象
相关操作:

va_list:传入参数,辅助获取参数;
va_start:对参数进行初始化;
va_arg:从参数列表一个一个取出;
av_end: 结束可变参数的获取,清空 va_list 

【注意】:

  • 函数本身无法知道参数类型以及参数的数量;
  • 对于没有定义转移字的非POD,使用变长函数会导致未定义;

示例:

int SumOfFloat(int cnt, ...) {va_list ap;int sum = 0;va_start(ap, cnt);for (int i = 0; i < cnt; ++i) {sum += va_arg(ap, int);}va_end(ap);return sum;
}int main() {cout << SumOfFloat(3, 12, 10, 1) << endl;return 0;
}

格式化输出

snprintf

snprintf,用于格式化字符串,并将结果存储到一个字符数组中

/*
str:用于存储格式化后的字符串。
size:这是目标字符数组的最大容量。
format:格式化字符串。
...:这是可选的参数。
*/
int snprintf(char *str, size_t size, const char *format, ...);
#include <iostream>
#include <stdlib.h>
int main() {char buffer[50];int a, b;std::cin >> a >> b;int c = a + b;int result = snprintf(buffer, sizeof(buffer), "%d+%d=%d", a , b , c);if (result >= 0 && result < sizeof(buffer)) {printf("result format: %s\n", buffer);} else {printf("error.\n");}return 0;
}

vsnprintf

snprintf不同的是它允许你使用变长参数列表(va_list)来传递参数。

/*
str:用于存储格式化后的字符串。
size:这是目标字符数组的最大容量。
format:这是一个格式化字符串
ap:va_list 类型的参数。
*/
int vsnprintf(char *str, size_t size, const char *format, va_list ap);

vasprintf

vasprintf可以通过可变参数创建一个格式化的字符串,并将其存储在动态分配的内存中。

/*
str用于存储格式化字符串的结果。
format:格式化字符串的格式。
ap:va_list 类型的参数。
*/
int vasprintf(char **str, const char *format, va_list ap);

实例

void format(const char* fmt , ...){va_list al;va_start(al , fmt);format(fmt , al);va_end(al);
}
void format(const char* fmt , va_list al){char* buf = nullptr;int len = vasprintf(&buf , fmt , al);if(len != -1){m_ss << std::string(buf , len);free(buf);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/212424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 手写设计HashMap源码,让面试官膜拜

Java 手写HashMap源码&#xff0c;让面试官膜拜 一&#xff0c;手写源码 这是一个模仿HashMap的put&#xff0c;get功能的自定义的MyHashMap package cn.wxs.demo;import java.io.Serializable; import java.util.*; import java.util.function.BiConsumer;class MyHashMap&…

面向对象三大特征——封装

目录 1. 封装概述&#xff08;封装与隐藏&#xff09; 2. private关键字 3. Getter & Setter方法 4. 变量访问原则和this关键字 5. 构造方法 5.1 构造方法概述 5.2 构造方法和set方法的比较 6. 静态 6.1 静态概述 6.2 静态效果 6.3 静态变量和非静态变量的区别 …

win11 CUDA(12.3) + cuDNN(12.x) 卸载

win11 CUDA&#xff08;12.3&#xff09; cuDNN&#xff08;12.x&#xff09;卸载 信息介绍卸载 信息介绍 本文是对应 win11RTX4070Ti 安装 CUDA cuDNN&#xff08;图文教程&#xff09; 的卸载 卸载 控制面板 --> 程序 --> 卸载程序 卸载掉图中红框内的&#xff0c…

C语言-水仙花数

水仙花数是指一个N位正整数&#xff08;N≥3&#xff09;&#xff0c;它的每个位上的数字的N次幂之和等于它本身。例如&#xff1a;153135333。 本题要求编写程序,计算所有N位水仙花数。 输入格式: 输入在一行中给出一个正整数N&#xff08;3≤N≤7&#xff09;。 输出格式…

reinforce 跑 CartPole-v1

gym版本是0.26.1 CartPole-v1的详细信息&#xff0c;点链接里看就行了。 修改了下动手深度强化学习对应的代码。 然后这里 J ( θ ) J(\theta) J(θ)梯度上升更新的公式是用的不严谨的&#xff0c;这个和王树森书里讲的严谨公式有点区别。 代码 import gym import torch from …

innobackupex备份目录

innobackupeex全备脚本思路 四个需求如下&#xff1a; &#xff08;1&#xff09;每天晚上23点执行&#xff0c;这需要linux系统做一个定时任务 00 23 * * * /bin/sh /shell/tencent_xtrabackup_all.sh /dev/null 2>&1 &#xff08;2&#xff09;每天。。看到这个词…

标识符···

定义 标识符只能由字母、数字、下划线&#xff08;_&#xff09;和美元符号&#xff08;$&#xff09;组成。标识符必须以字母、下划线或美元符号开头&#xff0c;不能以数字开头。标识符对大小写敏感&#xff0c;例如"myVariable"和"myvariable"是不同的…

Android 11 适配——整理总结篇

背景 > 经过检测&#xff0c;我们识别到您的应用&#xff0c;目前未适配安卓11&#xff08;API30&#xff09;&#xff0c;请您关注适配截止时间&#xff0c;尽快开展适配工作&#xff0c;避免影响应用正常发布和经营。 > targetSdkVersion30 升级适配工作参考文档&am…

从零开发短视频电商 Jmeter压测示例模板详解(无认证场景)

文章目录 添加线程组添加定时器添加HTTP请求默认值添加HTTP头管理添加HTTP请求添加结果断言响应断言 Response AssertionJSON断言 JSON Assertion持续时间断言 Duration Assertion 添加察看结果树添加聚合报告添加表格察看结果参考 以压测百度搜索为例 https://www.baidu.com/s…

class066 一维动态规划【算法】

class066 一维动态规划 算法讲解066【必备】从递归入手一维动态规划 code1 509斐波那契数列 // 斐波那契数 // 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 // 该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。…

kotlin - ViewBinding

前言 为什么用ViewBinding&#xff0c;而不用findViewById()&#xff0c;这个有很多优秀的博主都做了讲解&#xff0c;就不再列出了。 可参考下列博主的文章&#xff1a; kotlin ViewBinding的使用 文章里也给出了如何在gradle中做出相应的配置。 &#xff08;我建议先看这位博…

【LeetCode热题100】【滑动窗口】无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为无…

Docker安装教程

docker官网 1.卸载旧版 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2.配置Docker的yum库 安装yum工具 yum install -y yum-utils配置Docker的yum源 yum-config-ma…

Redis,什么是缓存穿透?怎么解决?

Redis&#xff0c;什么是缓存穿透&#xff1f;怎么解决&#xff1f; 1、缓存穿透 一般的缓存系统&#xff0c;都是按照key去缓存查询&#xff0c;如果不存在对用的value&#xff0c;就应该去后端系统查找&#xff08;比如DB数据库&#xff09;。一些恶意的请求会故意查询不存在…

不想写大量 if 判断?试试用规则执行器优化,就很丝滑!

近日在公司领到一个小需求&#xff0c;需要对之前已有的试用用户申请规则进行拓展。我们的场景大概如下所示: if (是否海外用户) {return false; }if (刷单用户) {return false; }if (未付费用户 && 不再服务时段) {return false }if (转介绍用户 || 付费用户 || 内推…

16ASM 分段和机器码

8086CPU存储分段管理 问题1&#xff1a;8086是16位cpu&#xff0c;最多可访问&#xff08;寻址&#xff09;多大内存&#xff1f; 运算器一次最多处理16位的数据。地址寄存器的最大宽度为16位。访问的最大内存为&#xff1a;216 64K 即 0000 - FFFF。 问题2&#xff1a;808…

Hadoop集群破坏试验可靠性验证

集群环境说明&#xff1a; 准备5台服务器&#xff0c;hadoop1、hadoop2、hadoop3、hadoop4、hadoop5&#xff1b; 分别部署5个节点的zookeeper集群、hadoop集群、hbase集群 本次对于Hadoop集群测试主要分为五个方面&#xff1a; 手动进行datanode节点删除&#xff1a;&#…

typedef 与#define 的区别

typedef 与#define 的区别 typedef &#xff1a; 给一个已经存在的数据类型&#xff08;注意&#xff1a;是类型不是变量&#xff09;取一个别名&#xff0c;而非定义一个新的数据类型 #define宏定义&#xff1a; #define宏定义&#xff1a;在预编译时直接进行简单的文本替换 举…

WIFI直连(Wi-Fi P2P)

一、概述 Wifi peer-to-peer&#xff08;也称Wifi-Direct&#xff09;是Wifi联盟推出的一项基于原来WIfi技术的可以让设备与设备间直接连接的技术&#xff0c;使用户不需要借助局域网或者AP&#xff08;Access Point&#xff09;就可以进行一对一或一对多通信。这种技术的应用…

计算机毕业设计 SpringBoot的乐乐农产品销售系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…