0

我制作了一个自定义打印功能,它打印带有时间戳的消息。但是当我编译它时,编译器会说“格式字符串不是字符串文字”。它仍然可以正常编译,但我有点被这个错误困扰,因为编译器还说这可能不安全,所以我想修复它。

void Log(const char *message, ...)
{
    time_t rawtime;
    struct tm* timeinfo;
    char timestamp[11];

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    strftime(timestamp, 11, "%X: ", timeinfo);

    fprintf(stdout, timestamp); // format not a string literal and no format arguments [-Wformat-security]

    va_list args;
    va_start(args, message);
    vfprintf(stdout, message, args);
    va_end(args);
    fprintf(stdout, "\n");
}

我尝试将其更改timestamp为 aconst char*但随后strftime不接受它并且警告仍然存在。

我该如何解决这个问题,有没有办法优化这个功能(因为我不太了解C IO library)?

4

2 回答 2

2
fprintf(stdout, timestamp);

fprintf用于由格式字符串引导的格式化输出。不带参数调用但格式字符串有点误用,并且启动速度很慢。为了安全使用fprintf,您应该使用fprintf (stdout, "%s", timestamp);

或者,只需使用fputs (timestamp, stdout);This 绕过格式字符串的解析,并按原样将字符串打印到标准输出。这正是您想要的,而且速度更快,因为fputs不解析要打印的字符串。

于 2012-09-12T15:40:27.370 回答
0
fprintf(stdout, "%s", timestamp);

问题是,如果您的时间戳字符串包含 %s 或类似字符串,则 fprintf 函数将寻找一个额外的参数(您没有提供)。

于 2012-09-12T15:25:33.793 回答