C++之va_start、vasprintf、va_end应用总结(二百二十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:C++之va_start、vasprintf、va_end应用总结。

在C/C++语言中,va_startvasprintfva_end是与可变参数相关的函数。它们通常与stdarg.h头文件一起使用。

  1. va_start函数:

    • va_start函数用于初始化可变参数列表。它接受两个参数:第一个参数是一个va_list类型的变量,第二个参数是最后一个固定参数的前一个参数的名称。
    • 这个函数将va_list类型变量初始化为指向可变参数列表的起始位置。
  2. vasprintf函数:

    • vasprintf函数用于将格式化的可变参数输出到动态分配的字符串中。
    • 它接受两个参数:第一个参数是一个指向char指针的指针,第二个参数是一个格式化字符串。
    • 这个函数会根据格式化字符串和可变参数列表生成一个动态分配的字符串,并将指针保存在第一个参数所指向的位置。
  3. va_end函数:

    • va_end函数用于结束可变参数的获取。
    • 它接受一个参数,即一个va_list类型的变量。
    • 这个函数对可变参数列表进行清理,使其无法再被访问。

通常在需要处理可变参数的情况下,使用实现Printf风格的函数或者处理命令行参数时。

2.应用实例

<1>.v1.0

#include 
#include 

void sum(int count, ...)
{
    va_list args;
    int total = 0;
    
    // 初始化可变参数列表
    va_start(args, count);
    
    // 遍历可变参数列表并求和
    for (int i = 0; i < count; i++)
    {
        int num = va_arg(args, int);
        total += num;
    }
    
    // 结束可变参数列表
    va_end(args);
    
    printf("Sum: %d\n", total);
}

int main()
{
    sum(3, 1, 2, 3);  // 输出 Sum: 6
    
    return 0;
}

<2>.v2.0

#include 
#include 

char* format_string(const char* format, ...)
{
    va_list args;
    char* str;
    
    // 初始化可变参数列表
    va_start(args, format);
    
    // 格式化字符串并存储到动态分配的字符串中
    int length = vasprintf(&str, format, args);
    
    // 结束可变参数列表
    va_end(args);
    
    printf("Formatted String: %s\n", str);
    printf("String Length: %d\n", length);
    
    return str;
}

int main()
{
    char* result = format_string("Hello %s, your age is %d.", "John", 25);
    // 输出 Formatted String: Hello John, your age is 25.
    // 输出 String Length: 30
    
    free(result);  // 释放动态分配的字符串
    
    return 0;
}

<3>.v3.0

#include 
#include 
#include 
#include 
#include 

using namespace std;

string AStringPrintf(const char *format, ...) {
  va_list ap;
  va_start(ap, format);

  char *buffer;
  int bufferSize = vasprintf(&buffer, format, ap);

  va_end(ap);

  if(bufferSize < 0) {
    return string();
  }

  string result(buffer);

  free(buffer);
  buffer = NULL;

  return result;
}

int main(){
  char str[64]={1,2,3,5,6,7,8,9};

 string buf =  AStringPrintf(str);
 printf("buf = %s\n",buf.c_str());
}

<4>.v4.0

#include 
#include 
#include 

void dynamic_print(const char* format, ...)
{
  va_list args;
  va_start(args, format);

  char* dyn_str = NULL;
  size_t str_length = 0;

  // 计算动态生成字符串所需的长度
  str_length = vsnprintf(NULL, 0, format, args);

  // 为字符串动态分配内存
  dyn_str = (char*)malloc(str_length + 1);

  // 动态生成字符串
  vsnprintf(dyn_str, str_length + 1, format, args);

  printf("%s", dyn_str);

  free(dyn_str);
  va_end(args);
}

int main(){
  int num1 = 10;
  int num2 = 20;

  dynamic_print("Sum: %d + %d = %d\n", num1, num2, num1 + num2);

  return 0;
}

你可能感兴趣的:(C++入门系列,c++,开发语言)