怎样 给 va_list 新增参数 不是 printf
时间: 2024-03-03 16:47:05 浏览: 101
详解_C语言可变参数_va_list和_vsnprintf及printf实现
5星 · 资源好评率100%
给 `va_list` 新增参数,需要先将 `va_list` 对象转换成指向 `va_arg` 函数的指针,然后使用该指针依次获取可变参数列表中的参数,并将新参数添加到获取到的参数后面。以下是一个示例代码:
```c
#include <stdarg.h>
#include <stdio.h>
void add_int_to_va_list(va_list *ap, int new_val) {
// 获取 va_list 中的参数个数
va_list ap_copy;
va_copy(ap_copy, *ap);
int count = 0;
while (va_arg(ap_copy, int)) {
count++;
}
va_end(ap_copy);
// 将 va_list 对象转换成指向 va_arg 函数的指针
int *p = va_arg(*ap, int *);
// 将新参数添加到获取到的参数后面
p[count] = new_val;
}
void test(int count, ...) {
va_list ap;
va_start(ap, count);
// 获取 va_list 中的参数,存储到数组中
int arr[count];
for (int i = 0; i < count; i++) {
arr[i] = va_arg(ap, int);
}
// 新增参数
int new_val = 123;
add_int_to_va_list(&ap, new_val);
va_end(ap);
// 输出参数
for (int i = 0; i < count + 1; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
test(3, 1, 2, 3);
return 0;
}
```
上述代码中,`add_int_to_va_list` 函数将 `va_list` 对象转换成指向 `va_arg` 函数的指针,然后获取可变参数列表中的参数,并将新参数添加到获取到的参数后面。`test` 函数首先获取 `va_list` 中的参数,存储到数组中,然后调用 `add_int_to_va_list` 函数新增参数,并输出所有参数。
注意,上述示例代码中,`add_int_to_va_list` 函数的第一个参数是指向 `va_list` 对象的指针,因为在 C 语言中,函数参数是值传递的,如果直接传递 `va_list` 对象,将会无法修改 `va_list` 对象的值。
阅读全文