我制作了一个自定义打印功能,用于打印带有时间戳的消息。但是当我编译它时,编译器会说“格式字符串不是字符串文字”。它仍然编译得很好,但我有点被这个错误所困扰,因为编译器也说这可能是不安全的,所以我想解决它。
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
了解不多)?
答案 0 :(得分:2)
fprintf(stdout, timestamp);
fprintf
用于格式化字符串指示的格式化输出。调用没有参数但格式字符串有点滥用,并且启动速度很慢。为了使用fprintf
安全起见,您应该使用fprintf (stdout, "%s", timestamp);
或者,只需使用fputs (timestamp, stdout);
这会绕过格式字符串的解析,并将字符串打印到标准输出中。这正是您想要的,并且它更快,因为fputs
不解析要打印的字符串。
答案 1 :(得分:0)
fprintf(stdout, "%s", timestamp);
问题是如果你的时间戳字符串包含%s或类似,那么fprintf函数会寻找另一个参数(你没有提供)。