C/C++ 不定参函数
C语言不定参函数
函数用法总结
Va_list
- 作用:类型定义,生命一个变量,该变量被用来访问传递给不定参函数的可变参数列表
- 用法:供后续函数进调用,通过该变量访问参数列表
typedefchar* va_list;
va_start
- 作用:初始化va_list变量,指向可变参数列表中的第一个参数,这个宏需要知道最后一个固定参数的位置,方便从其后开始读取可变参数
- 参数:ap(初始化的va_list变量)、last_artg(确定从哪里开始读取可变参数4)
voidva_start(va_list ap, last_arg);
va_arg
- 作用:va_arg宏用于获取可变参数列表中的下一个参数,并将其转换为指定的类型
- 参数:ap,type指定要获取的参数类型
- 返回值:返回指定类型的下一个参数值,并将va_list 变量指向下一个参数
type va_arg(va_list ap, type);
va_end
- 作用:用于清理va_list变量
- 参数:ap需要清理的va_list变量
voidva_end(va_list ap);
使用事例
使用事例
- 至少定义一个固定参数的函数,然后后面的参数使用... 表示
- va_list args:定义一个变量,用于存储不定参数的列表
- va_start(args, fixeArg):初始化args,并让其指向可变参数列表的开始;fixeArg则是最后一个固定参数,用于确定从哪里开始寻找可变参数
- va_arg(args,int):获取当前参数,类型设置为int,并将指针移动到下一个参数
- va_end(args):清理va_list,结束不定参数的获取
#include<stdarg.h>
#include <stdio.h>
// 定义一个不定参函数
void exampleFunction(int fixedArg, ...)
{
va_list args;
va_start(args, fixedArg);// 获取不定参
int nextArg;
while ((nextArg = va_arg(args, int)) != 0)
{printf("Argument: %d\n", nextArg);
}va_end(args);
}int main()
{exampleFunction(1, 2, 3, 4, 5, 0); // 0作为终止条件return 0;
}
#include<iostream>
#include <cstdarg>
void printNum(int n, ...)
{va_list al;va_start(al, n); // 让al指向n参数之后的第一个可变参数for (int i = 0; i < n; i++) {int num = va_arg(al, int); // 从可变参数中取出一个整形参数std::cout << num << std::endl;}va_end(al); // 清空可变参数列表--其实是将al置空
}int main() {printNum(3, 11, 22, 33); // 输出:11 22 33printNum(5, 44, 55, 66, 77, 88); // 输出:44 55 66 77 88return 0;
}
vasprintf函数
格式化输出写入一个动态分配字符串
- char **strp:指向字符指针的指针,用于接收分配的内存的地址,
vasprintf
会为存储格式化后的字符串动态分配内存,并将其地址存储在*strp
中。调用者需要负责在使用完字符串后使用free()
函数释放这块内存- const char *fmt:这是格式化字符串,类似于
printf
函数中的格式化字符串。它可以包含格式说明符(如%d
,%s
等),并且需要与后续的可变参数相匹配- va_list ap:这是一个
va_list
类型的变量,用于传递可变参数列表。它通常通过va_start
宏初始化返回值
- 成功:返回生成字符串的长度
- 失败:返回-1,同时将*strp设置成NULL
intvasprintf(char **strp, constchar *fmt, va_list ap);
- 函数create_message:初始化变量ap,从fmt之后的参数开始获取可变参数
- vasprintf:根据fmt中的格式化字符串,以及ap生成最终字符串,动态分配内存存储生成的字符串,并将其存储在strp中(将格式化字符格式和可变参数结合,生成固定格式的消息,存储在strp中)
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>int create_message(char **strp, const char *fmt, ...) {va_list ap;va_start(ap, fmt);int result = vasprintf(strp, fmt, ap);va_end(ap);return result;
}int main() {char *message;int length = create_message(&message, "Hello, %s! You have %d new messages.", "Alice", 5);if (length != -1) {printf("Generated string: %s\n", message);printf("String length: %d\n", length);free(message); // 记得释放分配的内存} else {fprintf(stderr, "Memory allocation failed\n");}return 0;
}//
Generated string: Hello, Alice! You have 5 new messages.
String length: 34
C++风格不定参
不定参宏实现日志功能
- 宏定义:#define Log( fmt , ...):定义一个Log宏,该宏接受一个格式化字符串fmt,以及一个可变数量的附加参数
- __FILE__和 __LINE__:预定义宏,当前源文件的文件名和行号
- ##__VA_ARGS:宏的可变参数部分为空的时候,可以自动取出前面的逗号,避免语法错误
#include<iostream>
#include <cstdarg>
#define LOG(fmt, ...) printf("[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)int main()
{LOG("%s-%s", "hello", "世界");LOG("%s-%s", "hello", "中国");return 0;
}
实现C风格的不定参函数
基本与C语言风格相同
#include<iostream>
#include <cstdarg>
void printNumbers(int count, ...)
{va_list args;va_start(args, count); // 初始化 va_list 并将其指向 count 之后的第一个可变参数for (int i = 0; i < count; ++i) {int num = va_arg(args, int); // 逐个获取参数std::cout << num << " ";}va_end(args); // 清理 va_liststd::cout << std::endl;
}int main() {printNumbers(3, 10, 20, 30); // 输出: 10 20 30printNumbers(5, 1, 2, 3, 4, 5); // 输出: 1 2 3 4 5return 0;
}
C++11可变模版
通过递归模版展开
#include<iostream>
void print() {
std::cout << std::endl; // 递归基例:什么都不做,只是结束递归
}template<typename T, typename... Args>void print(T first, Args... args) {std::cout << first << " "; // 打印第一个参数print(args...); // 递归调用 print 处理剩余参数
}int main() {print(1, 2.5, "Hello", 'c'); // 输出: 1 2.5 Hello creturn 0;
}
C++17折叠表达式
#include<iostream>
template<typename... Args>
void print(Args... args) {(std::cout << ... << args) << std::endl; // 使用折叠表达式展开参数包
}int main() {print(1, 2.5, "Hello", 'c'); // 输出: 1 2.5 Hello creturn 0;
}
ofstream
专门用于文件输出操作,就是将数据写入文件。fstream
是 std::basic_ofstream
的一个实例化,std::basic_ofstream
是一个模板类,用于处理各种字符类型的文件输出。ofstream
专门处理 char
类型的文件
基本使用总结
文件打开关闭
- ofstream对象可以利用自身构造或者open方法打开文件,文件只要被打开,程序就可以将数据写入文件
- 程序结束或者该对象销毁的到时候,文件会自动关闭,也可以手动关闭文件,即调用close()方法
std::ofstream file("example.txt");
if (file.is_open()) {// 文件已成功打开,可以进行写入操作
}
写入数据
- 支持向文件写入多种类型的数据
std::ofstream file("example.txt");
if (file.is_open()) {file << "Hello, World!" << std::endl;file << 123 << std::endl;file << 45.67 << std::endl;
}
检查文件状态
- is_open():检查文件是否成功打开
- good():检查文件流是否处于有效状态
- fail:检查是否出现了某种错误
std::ofstream file("example.txt");
if (!file) {std::cerr << "Failed to open the file." << std::endl;
}
文件模式
std::ios::out
:默认模式,表示文件用于写入。std::ios::app
:追加模式,在文件末尾添加内容而不覆盖已有内容。std::ios::trunc
:清空文件内容(默认行为,如果文件已存在)。std::ios::binary
:以二进制模式打开文件,而非文本模式
std::ofstream file("example.txt", std::ios::app);
自动资源管理
- 内部是RAII模式管理文件资源,只要该对象超出作用域,文件就会自动关闭
{std::ofstream file("example.txt");file << "This will be written to the file." << std::endl;
} // file 对象超出作用域,文件自动关闭
ifstream
标准库中的一个类,属于 <fstream>
头文件,它用于文件输入操作,即从文件中读取数据。ifstream
是 std::basic_ifstream
的一个实例化,std::basic_ifstream
是一个模板类,用于处理各种字符类型的文件输入。ifstream
专门处理 char
类型的文件
基本使用总结
文件打开和关闭,与Ofstream相同,构造函数打开,打开后程序可以从文件中读取数据,程序结束或者对象被销毁的时候,文件自动关闭。手动关闭就是close()
std::ifstream file("example.txt");
if (file.is_open()) {// 文件已成功打开,可以进行读取操作
}
读取数据,使用>>提取运算符从文件中读取数据
std::ifstream file("example.txt");
if (file.is_open()) {std::string str;int num;file >> str >> num;std::cout << "Read string: " << str << ", number: " << num << std::endl;
}
检查文件状态,is_open是否成功打开,good()文件流是否处于有效状态,fail检查是否错误
std::ifstream file("example.txt");
if (!file) {std::cerr << "Failed to open the file." << std::endl;
}
文件模式
std::ios::in
:默认模式,表示文件用于读取。std::ios::binary
:以二进制模式打开文件,而非文本模式
std::ifstream file("example.txt", std::ios::binary);
相关文章:

C/C++ 不定参函数
C语言不定参函数 函数用法总结 Va_list 作用:类型定义,生命一个变量,该变量被用来访问传递给不定参函数的可变参数列表用法:供后续函数进调用,通过该变量访问参数列表 typedefchar* va_list; va_start 作用ÿ…...

C语言——函数专题
1.概念 在C语言中引入函数的概念,有些翻译为子程序。C语言中的函数就是一个完成某项特定任务的一小段代码,这个代码是有特殊的写法和调用方法的。一般我们可以分为两种函数:库函数和自定义函数。 2.库函数 C语言国际标准ANSIC规定了一些常…...

springboot打可执行jar包
1. pom文件如下 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…...

【SQL】科目种类
目录 题目 分析 代码 题目 表: Teacher ------------------- | Column Name | Type | ------------------- | teacher_id | int | | subject_id | int | | dept_id | int | ------------------- 在 SQL 中,(subject_id, dept_id) 是该表的主键。 该表…...

【深度学习】【语音】TTS,最新TTS模型概览,扩散模型TTS,MeloTTS、StyleTTS2、Matcha-TTS
文章目录 基础介绍对比基础介绍 MeloTTS: MeloTTS 是 MyShell.ai 开发的一个多语言语音合成模型,支持包括英语、西班牙语、法语、中文、日语和韩语等多种语言。它以高质量的语音合成为特色,尤其擅长处理中英混合内容。该模型优化了在 CPU 上的实时推理能力,使其在多种应用场…...

【论文笔记】LION: Linear Group RNN for 3D Object Detection in Point Clouds
原文链接:https://arxiv.org/abs/2407.18232 简介:Transformer在3D点云感知任务中有二次复杂度,难以进行长距离关系建模。线性RNN则计算复杂度较低,适合进行长距离关系建模。本文提出基于窗口的网络线性组RNN(即对分组…...

打造高可用集群的基石:深度解析Keepalived实践与优化
高可用集群 集群类型 集群类型主要分为负载均衡集群(LB)、高可用集群(HA)和高性能计算集群(HPC)三大类。每种集群类型都有其特定的应用场景和优势。 1. 负载均衡集群(LB) 负载均衡集…...

Web大学生网页作业成品——环保主题介绍网页网站设计与实现(HTML+CSS)(5个页面)
🎉🎉🎉 常见网页设计作业题材有**汽车、环保、明星、文化、国家、抗疫、景点、人物、体育、植物、公益、图书、节日、游戏、商城、旅游、家乡、学校、电影、动漫、非遗、动物、个人、企业、美食、婚纱、其他**等网页设计题目, 可满足大学生网…...

Qt登录窗口设计
widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> //图标类 #include <QPushButton> #include <QLineEdit> //行编辑 #include <QLabel> #include <QTextEdit> #include <QMovie>class Widge…...

探索数据矿藏:我的AI大模型与数据挖掘实战经验分享
🚀 探索数据矿藏:我的AI大模型与数据挖掘实战经验分享 💖 前言:数据的金矿,AI的翅膀 在人工智能的浪潮中,我有幸作为项目负责人,带领团队深入挖掘数据的潜力,利用AI大模型的力量&am…...

linux C语言strcat函数及相关函数
讯飞星火 strcat函数是C语言中的一个字符串处理函数,用于将一个字符串追加到另一个字符串的末尾。它的原型如下: char *strcat(char *dest, const char *src);参数说明: dest:目标字符串,即要将src字符串追加到这个字符串的末尾。src:源字符串,即要追加到dest字符串末…...

使用 sort 进行文本文件处理
sort 使用经验笔记 一、简介 sort 是一个命令行工具,用于对文本文件中的行进行排序。它广泛应用于 Unix/Linux 系统中,可以用来对文件的内容进行简单的排序操作,也可以与其他命令结合使用来完成更复杂的任务。 二、基本用法 排序文件: sor…...

HarmonyOS笔记4:从云数据库获取数据
移动应用获取数据的方式主要有: 1.从网络中获取数据接口API。 2.从华为云数据库获取云数据库的资源。 3.从移动终端直接获取本地的数据 在HarmonyOS笔记3中已经完成了方式一从网络中获取数据接口API的方式。在本篇笔记中,将讨论从云数据库中获取数据。 因…...

QT5生成独立运行的exe文件
目录 1 生成独立运行的exe文件1.1 设置工程Release版本可执行文件存储路径1.2 将工程编译成Release版本 2 使用QT5自带的windeployqt拷贝软件运行依赖项3 将程序打包成一个独立的可执行软件exe4 解决QT5 This application failed to start because no Qt platform plugin could…...

LabVIEW光纤水听器闭环系统
开发了一种利用LabVIEW软件开发的干涉型光纤水听器闭环工作点控制系统。该系统通过调节光源频率和非平衡干涉仪的光程差,实现了工作点的精确控制,从而提高系统的稳定性和检测精度,避免了使用压电陶瓷,使操作更加简便。 项目背景 …...

Shell——流程控制语句(if、case、for、while等)
在 Shell 编程中,流程控制语句用于控制脚本的执行顺序和逻辑。这些语句包括 if、case、for、while 等,它们的使用可以使脚本实现更复杂的逻辑。以下是它们的详细说明和语法结构: 1. if 语句 if 语句用于条件判断,执行符合条件的…...

【redis的大key问题】
在使用 Redis 的过程中,如果未能及时发现并处理 Big keys(下文称为“大Key”),可能会导致服务性能下降、用户体验变差,甚至引发大面积故障。 本文将介绍大Key产生的原因、其可能引发的问题及如何快速找出大Key并将其优…...

HighPoint SSD7749M2:128TB NVMe 存储卡实现28 GB/s高速传输
HighPoint Technologies推出了一款全新的SSD7749M2 RAID卡,能够在标准的桌面工作站中安装多达16个M.2 SSD,实现高达128TB的闪存存储。该卡通过PCIe Gen4 x16接口提供高达28 GB/s的顺序读写性能。这些令人瞩目的性能规格伴随着高昂的价格标签。 #### 技术…...

ARM 裸机与 Linux 驱动对比及 Linux 内核入门
目录 ARM裸机代码和驱动的区别 Linux系统组成 内核五大功能 设备驱动分类 内核类型 驱动模块 驱动模块示例 Makefile配置 命令 编码辅助工具 内核中的打印函数 printk 函数 修改打印级别 编辑 打印级别含义 驱动多文件编译 示例 模块传递参数 命令行传递参数…...

0101DNS TCP fallback on UDP query timeout disabled-redission-中间件
文章目录 1.问题描述2.临时解决方案 结语 1.问题描述 Springcloud 项目,微服务模块使用redission,启动报错 DNS TCP fallback on UDP query timeout disabled. Upgrade Netty to 4.1.105 or higher.相关软件版本如下 软件版本描述springboot2.7.18spr…...

位运算
x1010 原码:000...1010 (一共32位) 反码:111...0101 (~x) 补码:111...0110 (反码1)(-x) 1、n 的二进制表示中第 k 位是几 #include<iost…...

MemFire Cloud是否真的可以取代后端
近年来,随着前端技术的迅速发展,前端工程师们越来越多地开始思考一个问题:“我还能不能不依赖后端?” 这种想法并非空穴来风,尤其是随着像MemFire Cloud这样的工具出现,它不仅能让开发者在没有后端的情况下…...

数据结构(邓俊辉)学习笔记】优先级队列 06——完全二叉堆:批量建堆
文章目录 1. 自上而下的上滤:算法2. 自上而下的上滤:效率3. 自下而上的下滤:算法4. 自下而上的下滤:实例5. 自下而上的下滤:效率 1. 自上而下的上滤:算法 在介绍过完全二叉堆标准的静态和动态操作接口之后…...

Java | Leetcode Java题解之第344题反转字符串
题目: 题解: class Solution {public void reverseString(char[] s) {int n s.length;for (int left 0, right n - 1; left < right; left, --right) {char tmp s[left];s[left] s[right];s[right] tmp;}} }...

定制开发AI智能名片O2O商城小程序:基于限量策略与个性化追求的营销创新
摘要:随着科技的飞速发展和消费者需求的日益多元化,传统商业模式正经历着前所未有的变革。在数字化转型的大潮中,定制开发AI智能名片O2O商城小程序作为一种新兴的商业模式,凭借其独特的个性化定制能力、高效的线上线下融合(O2O&am…...

Spring MVC Controller返回json日期格式配置失效的解决办法
如题,Spring MVC 4.3.0版本,配置jackson读写json。Controller层方法返回值对象包含java.util.Date类型的属性,并且在applicationContext.xml中配置了jackson的日期格式: <mvc:annotation-driven><mvc:message-converters…...

3.Default Constructor的构造操作
目录 1. 问题引入 2. 4种implicitly声明的default constructor 1. 问题引入 “default constructors......在需要的时候被编译产生出来”。关键词是“在需要的时候”,被谁需要,做什么事情?看看下面的代码,然后梳理下思路。 cl…...

CSS的:current伪类:精准定位当前活动元素
CSS(层叠样式表)是控制网页样式的核心语言。随着CSS4的提出,一系列新的选择器被引入,其中:current伪类便是这些新特性之一。:current伪类允许开发者选择当前处于活动状态的元素,这在创建动态和交互性网页时非常有用。本…...

搭建个人网站
一 个人搭建网站需要进行的操作 详细步骤: 1 网站目标:搭建在线查看法拍房拍卖价格的预测模型,输出预测结果 2 实际功能:在线爬取 阿里法拍网站的信息 3 根据实时模型建模预测法拍价格和成交概率 要搭建一个能够在线查看法拍房拍卖…...

机器学习课程学习周报八
机器学习课程学习周报八 文章目录 机器学习课程学习周报八摘要Abstract一、机器学习部分1.1 self-attention的计算量1.2 人类理解代替自注意力计算1.2.1 Local Attention/Truncated Attention1.2.2 Stride Attention1.2.3 Global Attention1.2.4 聚类Query和Key 1.3 自动选择自…...