C 修改printf

C 修改printf,c,C,我想将函数printf修改为一个新函数printf2,该函数只在要打印的消息前面加上Hello 我可以 void printf2(char message[]) { printf("Hello "); printf(message); } 问题是当消息具有%d、%c等时,我无法传递额外的参数 如何让printf2接受printf所能接受的尽可能多的参数,并将它们传递给printf 您应该使用下面的函数来控制变量参数 void va_start( va_list arg_ptr,

我想将函数
printf
修改为一个新函数
printf2
,该函数只在要打印的消息前面加上
Hello

我可以

void printf2(char message[]) {
    printf("Hello ");
    printf(message);
}
问题是当
消息
具有
%d
%c
等时,我无法传递额外的参数

如何让
printf2
接受
printf
所能接受的尽可能多的参数,并将它们传递给
printf

  • 您应该使用下面的函数来控制变量参数

    void va_start( va_list arg_ptr, prev_param );   
    type va_arg( va_list arg_ptr, type );   
    void va_end( va_list arg_ptr );  
    
  • 判断格式字符串。使用switch()语句判断
    %d
    %c
    %s


  • 上面的注释为您指出了正确的方向,但下面是一个如何预先添加标记(Hello)的示例

    注: 我使用了printf的s和n版本来格式化一个新字符串,该字符串不应溢出我的临时缓冲区,并且假定*MAX_MSG_SIZE*在其他地方被适当定义

    void printf2(const char *format, ...)
    {
    
        char buffer[MAX_MSG_SIZE] = "";  
    
    
        va_list args;
    
    
        va_start(args,format);
        vsnprintf(buffer, MAX_MSG_SIZE, format, args);
        va_end(args);   
    
        printf("Hello: %s\n", buffer);
    }
    
    注:

  • printf(“%s”,“Hello:”)比printf(“Hello:”)快一点 跳过格式字符串的扫描(阶段)
  • printf(消息);这真是个坏主意。当消息具有类似“%s”的内容时,它会崩溃

  • 查看
    vprintf
    :可能重复@KeithHalligan:我在嵌入式设备上,没有
    vprintf
    。你确定没有vprintf()?也许您只是没有#包括并假设结果错误意味着您没有vprintf()?您使用的是哪种嵌入式设备,以及哪种编译器?@Randomblue-请提供有关您的嵌入式开发环境(编译器、C99等)的一些详细信息。似乎不需要单独调用
    printf
    ;因此,不需要打印到字符串(及其相关的MAX_MSG_大小限制)。移动
    printf(“Hello:”)高于va_开始,并将
    vsnprintf()
    替换为
    printf(格式,args)
    print to string在我的示例从中提取的代码段中是必需的-但是您是正确的,有两种方法可以实现这一点。将
    vsnprintf()
    替换为
    printf(格式,args)不起作用。将其替换为
    vprintf(格式,args)可以。
    
    void print_message(char *format, ...)
    {
        printf("%s", "Hello: ")
        va_list ptr;
        va_start(ptr, format);
        vprintf(format, ptr);
        va_end(ptr);
    }