C语言之va_list

va_list

va_list 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。

va_list的用法

  1. 首先在函数里定义va_list 型的变量 ,这个变量是指向参数的指针 ,通过指针运算来调整访问的对象
  2. 然后用 va_start初始化变量刚定义的 va_list 变量 ,实际上 就是用 va_list 去指向函数的最后一个具名的参数;
  3. 然后用 va_arg 宏返回可变的参数,va_arg第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用 va_arg 获取各个参数);
  4. 因为栈地址是从高到低延伸的,所以加上你要的参数类型大小,就意味着栈顶指针指向你所要的参数,便可通过 底层 pop 得到。
  5. 最后用 av_end 宏结束可变参数的获取,即清空 va_list 。
  6. 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:这是一个格式化字符串,用于指定输出的格式,与 printfsnprintf 中的格式化字符串相同。
  • 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;
}

06-01
va_listC语言标准库中的一个类型,它用于存储函数的可变参数列表。va_list实际上是一个指向参数列表的指针,它由stdarg.h头文件中的宏va_start、va_arg和va_end来操作。 va_list类型的变量通常在函数中定义,用于接受可变参数列表。在函数中,我们可以使用va_start宏来初始化这个变量,va_arg宏来获取下一个参数的值,va_end宏来结束参数的获取。 下面是一个简单的例子: ```c #include <stdio.h> #include <stdarg.h> void print(char *format, ...) { va_list args; va_start(args, format); int n = va_arg(args, int); double d = va_arg(args, double); char *s = va_arg(args, char *); printf("%d %f %s\n", n, d, s); va_end(args); } int main() { print("%d %f %s\n", 42, 3.14, "hello world"); return 0; } ``` 在这个例子中,我们定义了一个print函数,它接受一个格式字符串和三个参数。在函数中,我们定义了一个va_list类型的变量args,使用va_start宏来初始化这个变量。然后,我们使用va_arg宏来获取三个参数的值,分别保存在n、d和s变量中。最后,我们使用printf函数输出这三个变量的值,并使用va_end宏来结束参数的获取。 在main函数中,我们调用print函数一次,输出"42 3.140000 hello world"。 总之,va_list是一个指向参数列表的指针,由stdarg.h头文件提供的宏来操作。在函数中,我们可以使用va_start、va_arg和va_end宏来获取可变参数列表中的参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值