You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用wsprintf正确打印const char*类型值避免输出乱码

问题原因

你的输出乱码为?????是字符类型不匹配导致的:

  • 存储消息映射的wmTranslation容器中所有字符串都是窄字符类型const char*
  • 宽字符格式化函数wsprintf的%s格式符默认期望接收宽字符串const wchar_t*,传入窄字符串会被错误解析为宽字符编码,最终输出乱码。

修复方案

方案1:使用窄字符输出链路

不需要宽字符场景下直接调用窄字符版本API即可:

void Msg(int Msg) {
    // 先查询key是否存在,避免不存在的Msg触发map自动插入空指针
    auto iter = wmTranslation.find(Msg);
    const char* translatedMessage = iter != wmTranslation.cend() ? iter->second : "WM_UNKNOWN";
    char szText[256] = {0};
    sprintf(szText, "Msg: %s", translatedMessage);
    OutputDebugStringA(szText);
}

方案2:显式指定窄字符串格式符适配宽字符输出

如果必须使用宽字符输出链路,修改格式符为%hs显式标注传入的是窄字符串,wsprintf会自动完成编码转换:

void Msg(int Msg) {
    auto iter = wmTranslation.find(Msg);
    const char* translatedMessage = iter != wmTranslation.cend() ? iter->second : "WM_UNKNOWN";
    WCHAR wsText[256] = L"";
    wsprintf(wsText, L"Msg: %hs", translatedMessage);
    OutputDebugStringW(wsText);
}

注意事项

  • 避免直接用wmTranslation[Msg]访问元素,当传入的Msg不存在于map中时,[]运算符会自动插入一个值为nullptr的新元素,后续访问空指针会导致程序崩溃。
  • 显式使用OutputDebugStringA/OutputDebugStringW而非默认的OutputDebugString,可以避免项目字符集设置变更导致的兼容问题。

内容的提问来源于stack exchange,提问作者user16852409

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:27:02