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をa に変更しようとしましたconst char*が、それstrftimeを受け入れず、警告がまだ残っていました。

これを修正するにはどうすればよいですか?また、この関数を最適化する方法はありますC IO libraryか?

4

2 に答える 2

2
fprintf(stdout, timestamp);

fprintf書式文字列によって指示された書式付き出力用です。引数なしでフォーマット文字列を呼び出すのは少し誤用であり、起動が遅くなります。を安全に使用するfprintfには、使用する必要がありますfprintf (stdout, "%s", timestamp);

または、単にfputs (timestamp, stdout);これを使用すると、フォーマット文字列の解析がバイパスされ、文字列がそのまま標準出力に出力されます。これはまさにあなたが望むものであり、fputs印刷される文字列を解析しないため高速です。

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

問題は、タイムスタンプ文字列に %s または類似の文字列が含まれている場合、fprintf 関数が (指定しなかった) 追加の引数を探すことです。

于 2012-09-12T15:25:33.793 に答える