C++ 中的不定参数与格式化字符串 # ## vsprintf

本文介绍了在C/C++中实现格式化字符串的多种方法,包括使用snprintf、std::stringstream及宏定义技巧。通过实例展示了如何利用宏定义进行灵活的参数传递,并提供了自定义调用vsprintf的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日志打印或者格式字符串时,可能会用到不定参数的使用,这里记录一下。
格式化字符串有很多方法:

  • snprintf
  • std::stringstream
  • # ##的使用

    ##是一个连接符号,用于把参数连在一起
    #是“字符串化”的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串
    并且# ##都只能出现在宏定义中

include <stdio.h>

#define test(n) printf("arg" #n " = %d\n", arg##n) 

int main(){
    int arg9 = 5;
    test(9);    //arg9 = 5
    return 0;
}
  • 有时候需要自己调用vsprintf
#include <stdio.h>                                 
#include <stdarg.h>
#include <string>                                  

void format_args(std::string &res, const char* format, ...){
    char buffer[256];                              
    va_list args;                                  
    va_start(args, format);               
    //使用vsnprintf避免buff不足, 出core
    vsnprintf(buffer, sizeof(buffer), format, args);    
    va_end(args);                                  

    res = buffer;                                  
} 

int main(){
    int arg1 = 5;                                  
    std::string arg2 = "OK";                       
    std::string res;                               

    format_args(res, "res is arg1 = %d, arg2 = %s", arg1, arg2.c_str()); 
    puts(res.c_str());                             
    return 0;                                      
} 

写博客发现个markdown的用法, 对标题符合#转: \#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值