网站怎么上百度,建站之星安装说明,网站左侧固定广告代码,网站弹出信息怎么做的C语言不定参函数
函数用法总结 Va_list 作用#xff1a;类型定义#xff0c;生命一个变量#xff0c;该变量被用来访问传递给不定参函数的可变参数列表用法#xff1a;供后续函数进调用#xff0c;通过该变量访问参数列表 typedefchar* va_list; va_start 作用#xff…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宏用于获取可变参数列表中的下一个参数并将其转换为指定的类型参数aptype指定要获取的参数类型 返回值返回指定类型的下一个参数值并将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结束不定参数的获取 #includestdarg.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;
} #includeiostream
#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.hint 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: 34C风格不定参
不定参宏实现日志功能 宏定义#define Log( fmt , ...定义一个Log宏该宏接受一个格式化字符串fmt以及一个可变数量的附加参数__FILE__和 __LINE__预定义宏当前源文件的文件名和行号##__VA_ARGS宏的可变参数部分为空的时候可以自动取出前面的逗号避免语法错误 #includeiostream
#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语言风格相同 #includeiostream
#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;
} C11可变模版 通过递归模版展开 #includeiostream
void print() {
std::cout std::endl; // 递归基例什么都不做只是结束递归
}templatetypename T, typename... Argsvoid 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;
} C17折叠表达式 #includeiostream
templatetypename... 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);