带时间戳的自定义打印功能发出警告

时间:2012-09-12 15:23:38

标签: c++ c timestamp printf

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

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更改为const char*,但后来strftime不接受,警告仍在那里。

如何解决此问题,是否有任何方法可以优化此功能(因为我对C IO library了解不多)?

2 个答案:

答案 0 :(得分:2)

fprintf(stdout, timestamp);

fprintf用于格式化字符串指示的格式化输出。调用没有参数但格式字符串有点滥用,并且启动速度很慢。为了使用fprintf安全起见,您应该使用fprintf (stdout, "%s", timestamp);

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

答案 1 :(得分:0)

fprintf(stdout, "%s", timestamp);

问题是如果你的时间戳字符串包含%s或类似,那么fprintf函数会寻找另一个参数(你没有提供)。