【C/C++】可变参数va_list与格式化输出

va_list与格式化输出

va_list

文章目录

  • va_list与格式化输出
    • va_list
    • 格式化输出
      • snprintf
      • vsnprintf
      • vasprintf
    • 实例

va_list是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个

用法:在函数里定义va_list 型的变量 ,这个变量是指向参数的指针 ,通过指针运算来调整访问的对象
相关操作:

va_list:传入参数,辅助获取参数;
va_start:对参数进行初始化;
va_arg:从参数列表一个一个取出;
av_end: 结束可变参数的获取,清空 va_list 

【注意】:

  • 函数本身无法知道参数类型以及参数的数量;
  • 对于没有定义转移字的非POD,使用变长函数会导致未定义;

示例:

int SumOfFloat(int cnt, ...) {
    va_list ap;
    int sum = 0;
    va_start(ap, cnt);
    for (int i = 0; i < cnt; ++i) {
        sum += va_arg(ap, int);
    }
    va_end(ap);
    return sum;
}

int main() {
    cout << SumOfFloat(3, 12, 10, 1) << endl;
    return 0;
}

格式化输出

snprintf

snprintf,用于格式化字符串,并将结果存储到一个字符数组中

/*
str:用于存储格式化后的字符串。
size:这是目标字符数组的最大容量。
format:格式化字符串。
...:这是可选的参数。
*/
int snprintf(char *str, size_t size, const char *format, ...);
#include 
#include 
int main() {
    char buffer[50];
    int a, b;
    std::cin >> a >> b;
    int c = a + b;
    int result = snprintf(buffer, sizeof(buffer), "%d+%d=%d", a , b , c);
    if (result >= 0 && result < sizeof(buffer)) {
        printf("result format: %s\n", buffer);
    } else {
        printf("error.\n");
    }
    return 0;
}

vsnprintf

snprintf不同的是它允许你使用变长参数列表(va_list)来传递参数。

/*
str:用于存储格式化后的字符串。
size:这是目标字符数组的最大容量。
format:这是一个格式化字符串
ap:va_list 类型的参数。
*/
int vsnprintf(char *str, size_t size, const char *format, va_list ap);

vasprintf

vasprintf可以通过可变参数创建一个格式化的字符串,并将其存储在动态分配的内存中。

/*
str用于存储格式化字符串的结果。
format:格式化字符串的格式。
ap:va_list 类型的参数。
*/
int vasprintf(char **str, const char *format, va_list ap);

实例

void format(const char* fmt , ...){
    va_list al;
    va_start(al , fmt);
    format(fmt , al);
    va_end(al);
}
void format(const char* fmt , va_list al){
    char* buf = nullptr;
    int len = vasprintf(&buf , fmt , al);
    if(len != -1){
        m_ss << std::string(buf , len);
        free(buf);
    }
}

你可能感兴趣的:(c++,c语言,c++,list,开发语言)