VA_LIST可变参数列表使用学习

前言

在C语言中,我们写函数的时候,有可能遇到函数入口参数不确定的问题,就可以使用val_list。va_list是为解决变参问题定义的一个类型,可以参数的个数不定,也可以每个参数的类型不同,使用需要包含头文件stdarg.h。
首先给出个例程:

#include <stdarg.h>
#include <stdio.h>static void print_(int num_args, ...) {va_list args;va_start(args, num_args);for (int i = 0; i < num_args; i++) {printf("%d ", va_arg(args, int));}va_end(args);
}int main() {print_(3, 1, 2, 3); // 打印显示1 2 3return 0;
}

(int num_args, …)中…:表示不定长参数。
va_list: 用于表示一个变长参数列表。可以通过宏va_start,va_arg和va_end对变长参数列表进行访问和操作。
va_start:宏定义,用于在使用变长参数函数时获取变长参数的起始地址。它的作用是初始化一个va_list类型的变量,使其指向变长参数列表的第一个参数。
va_arg:宏定义,获取变长参数的当前参数,返回指定类型并将指针指向下一参数。
va_end:回收变长参数列表指针。

不定长参数的类型也可以不同:

void student_print(int num_args, ...) {va_list args;va_start(args, num_args);printf("ID: %d ", va_arg(args, int));printf("name: %s ", va_arg(args, char*));printf("age: %d ", va_arg(args, int));va_end(args);
}int main() {student_print(3, 123, "Max", 20); // 打印显示ID: 123 name: Max age: 20return 0;
}

val_list经常跟vsnprintf函数(用于向一个字符串缓冲区打印格式化字符串)配合使用:

int vsnprintf (char *__restrict __s, size_t __maxlen,const char *__restrict __format, _G_va_list __arg)

那么上面的代码就可以改成:

#define SIZE_BUFF 200
void student_print(const char* comment, ...) {va_list args;char sbuf[200];va_start(args, comment);vsnprintf(sbuf, SIZE_BUFF, comment, args);printf("%s\n", sbuf);va_end(args);
}int main() {// student_print(3, 123, "Max", 20);student_print("ID: %d name: %s age: %d ", 123, "Max", 20);return 0;
}

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

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

相关文章

动手学RAG:汽车知识问答

原文&#xff1a;动手学RAG&#xff1a;汽车知识问答 - 知乎 Part1 内容介绍 在自然语言处理领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;如GPT-3、BERT等已经取得了显著的进展&#xff0c;它们能够生成连贯、自然的文本&#xff0c;回答问题&#xff0c;并执行…

Redis 面试题 | 20.精选Redis高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

在Ubuntu中修改系统时间并使其在掉电时保存

可以按照以下步骤进行&#xff1a; 打开终端。输入以下命令来修改系统时间&#xff1a; bash复制代码 sudo date --set"YYYY-MM-DD HH:MM:SS" 将YYYY-MM-DD HH:MM:SS替换为你想要设置的实际日期和时间。 3. 输入管理员密码以确认修改。 4. 输入以下命令来将系统时…

云原生周刊:K8s 1.26 到 1.29 版本的更新 | 2024.1.29

开源项目推荐 Skaffold Skaffold 是一个命令行工具&#xff0c;有助于 Kubernetes 应用程序的持续开发。您可以在本地迭代应用程序源代码&#xff0c;然后部署到本地或远程 Kubernetes 集群。Skaffold 处理构建、推送和部署应用程序的工作流程。它还提供构建块并描述 CI/CD 流…

ctfshow web72

下载源码&#xff1a; 开启环境&#xff1a; 本题设置了 open_basedir()&#xff0c;将php所能打开的文件限制在指定的目录树中&#xff0c;包括文件本身。 因为 ini_set() 也被限制了&#xff0c;所以 open_basedir() 不能用 ini_set() 重新设置绕过。 使用 php 伪协议 glob:…

上海亚商投顾:创业板指创调整新低,全市场超4800只个股下跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;创业板指午后跌超3%&#xff0c;深成指跌超2%&#xff0c;北证50指数跌逾6%。中…

msfconsole实战使用(结合靶场演示)

msfconsole实战使用 前言 MSFconsole&#xff08;Metasploit Framework Console&#xff09;是Metasploit框架的一部分&#xff0c;是一个功能强大的渗透测试工具。Metasploit框架是一个开源的安全工具&#xff0c;旨在开发、测试和执行针对计算机系统的攻击。MSFconsole是Me…

【Java IO 源码详解】: InputStream

本文主要从JDK 11 源码角度分析InputStream。 Java IO - 源码: InputStream InputStream 类实现关系InputStream 抽象类源码实现InputStreamFilterInputStreamByteArrayInputStreamBufferedInputStream 参考文章 InputStream 类实现关系 InputStream是输入字节流&#xff0c;具…

LabVIEW机械臂轨迹跟踪控制

介绍了一个使用LabVIEW开发的机械臂轨迹跟踪控制系统。该系统的主要目标是实现对机械臂运动轨迹的精确控制&#xff0c;使其能够按照预定路径进行精确移动。此系统特别适用于需要高精度位置控制的场合&#xff0c;如自动化装配、精密操作等。 为了实现LabVIEW环境下的机械臂轨迹…

80.双指针实现删除有序数组中的重复项 II(中等)-面试经典150题

题目 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明…

【SpringBoot3】集成Knife4j、springdoc-openapi作为接口文档

一、什么是springdoc-openapi Springdoc-openapi 是一个用于生成 OpenAPI&#xff08;之前称为 Swagger&#xff09;文档的库&#xff0c;专为 Spring Boot 应用程序设计。它可以根据你的 Spring MVC 控制器、REST 控制器和其他 Spring Bean 自动生成 OpenAPI 文档&#xff0c…

ElasticSearch重建/创建/删除索引操作 - 第501篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 E…

解决InputStream流无法重复使用的问题

一.需求 现在有个需求&#xff0c;要通过InputStream流先去判断文件类型&#xff0c;然后再上传文件&#xff0c;这样就会用到两次InputStream。 二.问题 这个功能之前的同事已经做了一版&#xff0c;一直以为是正常的&#xff0c;毕竟都很久了&#xff0c;但是我用的时候发…

仓库管理系统WMS设计思路

仓库管理系统职能范围 仓库管理系统(Warehouse Management System)是一种通过软件来管理和控制仓库操作的系统。制造企业仓库管理系统的职能范围一般包括:入库管理、出库管理、库存管理、订单管理、物流管理等。 1. 入库管理 入库管理是仓库管理系统中的重要环节。…

自然语言处理 TF-IDF

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Cesium 问题:遇到加载Cesium时各组件飞出

致敬爱的读者&#xff1a;该问题出现后暂时未找到最优的解决方案&#xff0c;而是将所有组件状态均进行隐藏&#xff0c;大家如果有解决方案可以留言、评论大家一起探讨解决&#xff0c;欢迎大家踊跃说出自己的想法 文章目录 问题分析 问题 在加载 Cesium 时出现各组件的位置不…

NTP时间同步服务器@客户端时钟同步设置

NTP时间同步服务器客户端时钟同步设置 时间同步服务器支持NTP和SNTP网络同步协议&#xff0c;是一款高精度、大容量、高品质的时钟产品。设备采用冗余架构设计&#xff0c;高精度时钟直接来源于北斗、GPS系统中各个卫星的原子钟&#xff0c;通过信号解析驯服本地时钟源&#x…

读书|长期主义

很早之前就看过穷查理宝典&#xff0c;这次重读&#xff0c;在“我不知道&#xff0c;我从来没有弹过”的语句中真正发现了芒格的幽默&#xff0c;也是触发了我对长期主义的重新思考。 这次尝试了一种新的读书方法&#xff0c;先是在书中读到了“长期主义”&#xff0c;又去搜索…

论文笔记:多任务学习模型:渐进式分层提取(PLE)含pytorch实现

整理了RecSys2020 Progressive Layered Extraction : A Novel Multi-Task Learning Model for Personalized Recommendations&#xff09;论文的阅读笔记 背景模型代码 论文地址&#xff1a;PLE 背景 多任务学习&#xff08;multi-task learning&#xff0c;MTL&#xff09;&a…

龙哥风向标 20230620~20230627 GPT拆解

BarberGPT&#xff1a;眨眼间改变发型&#xff0c;保护用户隐私的个人 AI 理发师网站 盈利点&#xff1a;BarberGPT提供了无限的可能性&#xff0c;用户可以在眨眼之间改变自己的发型&#xff0c;并且非常注重用户的隐私。盈利点可以包括付费的发型种类、社交媒体分享推广等。…