区分::wsprintf()与::swprintf()

在项目的核心算法模块中, 需要输出一些信息, 难免需要拼接字符串。 为了性能考虑, 我没有使用std::string或者QString, 以避免字符串拼接运算所带来的额外开销, 而是使用sprintf()把输出内容 Format 到 Buf 中, 再使用日志API输出。伪码如下:

void calculate()
{
    wchar_t logMessageBuf[128] = {0};

     int value = 1 + 1;
    ::swprintf(logMessageBuf, L"This is a log string. Value is %d", value);
    g_logger->log(logMessageBuf);
}

::wsprintf()无法输出浮点数, 也就是说下面的代码有问题:

void calculate()
{
    wchar_t logMessageBuf[128] = {0};

     double value = 1.0 + 1.0;
    ::wsprintf(logMessageBuf, L"This is a log string. Value is %lf", value);
    // Output: This is a log string. Value is f
    g_logger->log(logMessageBuf);
}

这是因为wsprintf()不支持浮点数的输出, 应该使用::swprintf()代替它。

::wsprintf是指 Windows String Print Formatted, 而::swprintf指的是 String Wide Char Print Formatted。这两者相差巨大。

注意, printf()系列函数没有对应于 float 型变量的格式控制符。 也就是说当你想使用printf()系列函数输出float时, 应使用double型的格式控制符, 也就是%lf

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容