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
#include 

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 
#include 

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 
#include 

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;
}

你可能感兴趣的:(C,c语言)