如何使用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
相关产品推荐
相关产品推荐

