Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有时间戳的自定义打印功能,提供警告_C++_C_Timestamp_Printf - Fatal编程技术网

C++ 带有时间戳的自定义打印功能,提供警告

C++ 带有时间戳的自定义打印功能,提供警告,c++,c,timestamp,printf,C++,C,Timestamp,Printf,我做了一个定制的打印函数,可以打印带有时间戳的消息。但当我编译它时,编译器说“格式字符串不是字符串文字”。它仍然可以很好地编译,但是我有点被这个错误所困扰,因为编译器也说这可能是不安全的,所以我想修复它 void Log(const char *message, ...) { time_t rawtime; struct tm* timeinfo; char timestamp[11]; time(&rawtime); timeinfo = lo

我做了一个定制的打印函数,可以打印带有时间戳的消息。但当我编译它时,编译器说“格式字符串不是字符串文字”。它仍然可以很好地编译,但是我有点被这个错误所困扰,因为编译器也说这可能是不安全的,所以我想修复它

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");
}
我尝试将
时间戳
更改为
const char*
,但
strftime
不接受,警告仍然存在

我如何解决这个问题,有没有办法优化这个函数(因为我不太了解
cio库

问题是,如果时间戳字符串包含%s或类似值,那么fprintf函数将查找附加参数(您没有提供)

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


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

这是一个适当的警告。您需要fprintf(标准输出,“%s”,时间戳);解释如下:或者他可以使用
put(timestamp)
并删除对
fprintf()
的第二个调用,因为
put
追加了一个换行符。
fprintf(stdout, "%s", timestamp);
fprintf(stdout, timestamp);