You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言可变参数传递方法及自定义格式化日志函数实现咨询

C语言可变参数日志函数实现

方案1:匹配原有写法的实现

该方案适配你给出的初始代码逻辑,依赖传入的可变参数个数num读取参数。需要注意的是C是强类型语言,没有额外类型标识的情况下无法自动识别可变参数的类型,因此该方案仅适用于参数类型固定的场景,扩展性较差:

#include <stdarg.h>
#include <stdio.h>

// 注意:标准库math.h中存在同名数学函数log,如果项目引入math.h请修改函数名
void log(const char* time, int num, ...)
{
    va_list valist;
    va_start(valist, num);

    // 输出时间前缀
    printf("%s", time);
    // 循环读取num个可变参数
    for (int i = 0; i < num; i++) {
        // 适配测试用例的参数类型:第1个可变参数为int,第2个为字符串
        if (i == 0) {
            int int_val = va_arg(valist, int);
            printf(" %d", int_val);
        } else if (i == 1) {
            char* str_val = va_arg(valist, char*);
            printf(" %s", str_val);
        }
    }
    printf("\n");

    va_end(valist);
}

int main()
{
    log("19:00", 2, 3, "abc");
    return 0;
}

运行后会直接输出你期望的结果:19:00 3 abc

方案2:支持格式化字符串的通用实现(更推荐)

该方案匹配你提出的更优用法需求,直接复用C标准库的格式化解析逻辑,支持所有printf兼容的格式化语法,适配任意类型的参数组合,扩展性和灵活性都更强,还可以自定义输出目标:

#include <stdarg.h>
#include <stdio.h>

// 基础版本:输出到标准输出
void log(const char* format, ...)
{
    va_list valist;
    va_start(valist, format);
    // 直接调用标准库vprintf处理可变参数
    vprintf(format, valist);
    printf("\n"); // 可选,自动追加换行
    va_end(valist);
}

// 进阶版本:支持输出到指定文件流(比如日志文件)
/*
void log(FILE* output_fp, const char* format, ...)
{
    va_list valist;
    va_start(valist, format);
    vfprintf(output_fp, format, valist);
    fprintf(output_fp, "\n");
    va_end(valist);
}
*/

int main()
{
    int d = 3;
    char s[4] = "abc"; // C语言字符串字面量自动带结束符\0,不需要手动添加
    log("%s %d %s", "19:00", d, s);
    // 进阶版本用法:输出到标准输出传stdout,输出到文件传fopen返回的文件指针即可
    // log(stdout, "%s %d %s", "19:00", d, s);
    return 0;
}

内容的提问来源于stack exchange,提问作者SAGALPREET SINGH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:15:06