C++ WINAPI场景下printf_s打印仅显示单个字符问题
问题原因与解决方案
你遇到的这个问题核心在于宽字符与窄字符的不匹配,咱们一步步拆解:
为什么只输出单个字符?
你的text是wchar_t类型的宽字符串(每个字符占2字节,UTF-16编码),但printf_s是专门处理窄字符(char类型,UTF-8或ANSI编码)的函数。当你强制把wchar_t*转成const char*传给printf_s时,函数会把宽字符串的第一个字符当成窄字符处理——比如如果第一个字符是L'A',它的二进制是0x0041,printf_s读到第一个字节0x41(对应'A')后,下一个字节是0x00,它会认为这是字符串的结束符\0,所以只会输出第一个字符。
两种解决办法
方法1:直接使用宽字符版的打印函数wprintf_s
既然你的字符串是宽字符,直接用对应的宽字符打印函数就可以了,不需要类型转换:
auto text = new wchar_t[WCHAR_MAX]; GetWindowTextW(hEdit, text, WCHAR_MAX); SetWindowTextW(hWnd, text); wprintf_s(text); // 替换printf_s为wprintf_s
方法2:将宽字符串转换为窄字符串(适合需要窄字符场景)
如果必须用printf_s,可以通过WideCharToMultiByte函数把宽字符串转成窄字符串,再打印:
auto text = new wchar_t[WCHAR_MAX]; GetWindowTextW(hEdit, text, WCHAR_MAX); SetWindowTextW(hWnd, text); // 计算需要的窄字符缓冲区大小 int bufferSize = WideCharToMultiByte(CP_UTF8, 0, text, -1, nullptr, 0, nullptr, nullptr); char* narrowText = new char[bufferSize]; // 执行转换 WideCharToMultiByte(CP_UTF8, 0, text, -1, narrowText, bufferSize, nullptr, nullptr); printf_s(narrowText); // 现在可以正常打印 // 记得释放内存 delete[] narrowText; delete[] text;
注意这里用了CP_UTF8编码,如果你需要系统默认的ANSI编码,可以换成CP_ACP,但UTF-8兼容性更好。
另外补充一点:使用new分配内存后记得用delete[]释放,避免内存泄漏哦~
内容的提问来源于stack exchange,提问作者NashiSM
相关产品推荐
相关产品推荐

