va_list
va_list
是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。
va_list的用法
- 首先在函数里定义va_list 型的变量 ,这个变量是指向参数的指针 ,通过指针运算来调整访问的对象;
- 然后用 va_start 宏初始化变量刚定义的 va_list 变量 ,实际上 就是用 va_list 去指向函数的最后一个具名的参数;
- 然后用 va_arg 宏返回可变的参数,va_arg 的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用 va_arg 获取各个参数);
- 因为栈地址是从高到低延伸的,所以加上你要的参数类型大小,就意味着栈顶指针指向你所要的参数,便可通过 底层 pop 得到。
- 最后用 av_end 宏结束可变参数的获取,即清空 va_list 。
-
int vsnprintf(char *str, size_t size, const char *format, va_list ap);参数:str保存输出字符数组存储区。size存储区的大小。format包含格式字符串的C字符串,其格式字符串与printf中的格式相同arg变量参数列表,用va_list 定义。
#include<stdarg.h>
#include <stdlib.h>
void sum(char* msg, ...)
{
va_list vaList; //定义一个va_list型的变量
va_start(vaList, msg); //va_start初始化vaList
int first = va_arg(vaList, int); //va_arg获取第一个参数
char* second = va_arg(vaList, char*); //va_arg获取第二个参数
int third = va_arg(vaList, int); //va_arg获取第三个参数
va_end(vaList); //va_end结束vaList,将vaList置NULL
char str[256]{0};
va_start(vaList, msg);
vsprintf(str, msg, vaList); //配合格式化字符串,输出可变参数
va_end(vaList);
printf("%s", str);
return;
}
int main()
{
sum("hello world %d %s %d", 9, "666", 3);
system("pause");
return 0;
}
snprintf
snprintf
是一个 C 标准库函数,用于格式化字符串,并将结果存储到一个字符数组中,同时限制字符串的长度
int snprintf(char *str, size_t size, const char *format, ...);
str
:这是一个指向字符数组的指针,用于存储格式化后的字符串。size
:这是目标字符数组的最大容量,也就是可以写入的最大字符数(包括 null 终止符)。format
:这是一个格式化字符串,用于指定输出的格式,类似于printf
中的格式化字符串。...
:这是可选的参数,用于填充格式化字符串中的占位符。
例子:
#include <stdio.h>
#include <stdlib.h>
int main() {
char buffer[20];
int num = 42;
int result = snprintf(buffer, sizeof(buffer), "The answer is %d", num);
if (result >= 0 && result < sizeof(buffer)) {
printf("Formatted string: %s\n", buffer);
} else {
printf("Buffer was not large enough.\n");
}
return 0;
}
vsnprintf
vsnprintf,用于格式化字符串并将结果存储到字符数组中,与 snprintf
类似,但它允许你使用变长参数列表(va_list)来传递参数。这使得你可以更灵活地生成格式化后的字符串。
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
str
:这是一个指向字符数组的指针,用于存储格式化后的字符串。size
:这是目标字符数组的最大容量,也就是可以写入的最大字符数(包括 null 终止符)。format
:这是一个格式化字符串,用于指定输出的格式,与printf
或snprintf
中的格式化字符串相同。ap
:这是一个 va_list 类型的参数,其中包含了格式化字符串中使用的可变参数。
#include <stdio.h>
#include <stdarg.h>
void customPrintf(char *buffer, size_t size, const char *format, ...) {
va_list args;
va_start(args, format);
vsnprintf(buffer, size, format, args);
va_end(args);
}
int main() {
char buffer[20];
customPrintf(buffer, sizeof(buffer), "The answer is %d", 42);
printf("Formatted string: %s\n", buffer);
return 0;
}