一、可变参数函数的理解
- 官方定义:C语言允许定义参数数量为可变的函数,这称为可变参数函数。它与传统意义上的强制定义固定参数的函数不同。
- 可变参数函数应用最广的是格式化输入输出函数。如printf,scanf。可支持任意参数输入输出。
- 可变参数函数可有助于我们封装printf函数。例如,可以指定打印到控制台或文件中。
二、可变参数函数的应用
1、可变参数的常规打印
直接参考代码,注释写的很清楚了。
代码的核心也是通过vprintf打印到控制台。
#include <stdlib.h>
#include <stdio.h>
// 可变参数的头文件
#include <stdarg.h>
// 默认为打印到控制台
void script_log_error(char *fmt, ...)
{
// 定义可变参数列表
va_list ap;
// 获取不定参数的首地址,首地址是从fmt开始
va_start(ap, fmt);
// 打印可变参数
printf("数据为:");
vprintf(fmt, ap);
// 结束
va_end(ap);
printf("\n");
}
int main()
{
// 使用可变参数的函数打印
script_log_error("type is_3:%f,%s,%d hunhe5", 362.01, "123654", 50);
script_log_error("type is_5: no data");
}
2、可变参数的解析并打印
解析主要分四步处理:
1.通过循环遍历的方式,解析每个输入字符
2.把%d、%f、%s作为关键字解析,并获取对应的数据。
3.把修饰性字符与实际数据都转换成字符串并存储于二维数组中。
4.把二维数组中的内容转换到一维数组中,然后打印一维数组。
#include <stdlib.h>
#include <stdio.h>
// 可变参数的头文件
#include <stdarg.h>
void script_dzlog_error(char *fmt, ...)
{
va_list ap;
char *p, *sval;
int ival;
double dval;
// 存储修饰性字符
char data_val[256] = {0};
// 存储每一段数据
char data[10][256] = {0};
int idx_d1 = 0;
int cnt_v = 0;
// 获取不定参数的首地址,首地址是从fmt开始
va_start(ap, fmt);
for (p = fmt; *p; p++) {
if(*p != '%') {
// 获取修饰性字符
data_val[cnt_v++] = *p;
continue;
}
switch(*++p) {
case 'd':
{
ival = va_arg(ap, int);
char tmp[128] = {0};
// 把修饰性字符复制到data中
memcpy(&data[idx_d1++][0], data_val, sizeof(data_val));
// 清空data_val
memset(data_val, 0x00, sizeof(data_val));
cnt_v = 0;
// 把数据型字符复制到data中
my_itoa(ival, tmp);
memcpy(&data[idx_d1++][0], tmp, sizeof(tmp));
break;
}
case 'f':
{
dval = va_arg(ap, double);
char tmp[128] = {0};
// 把修饰性字符复制到data中
memcpy(&data[idx_d1++][0], data_val, sizeof(data_val));
// 清空data_val
memset(data_val, 0x00,