使用GetComputerNameW打印计算机名时输出异常的C语言问题求助
问题原因及解决办法
你的问题出在宽字符字符串的控制台输出兼容上:
GetComputerNameW返回的是UTF-16编码的宽字符(wchar_t)字符串,每个字符占2字节,比如D对应的是0x44 0x00。- 控制台默认是单字节输出模式,会把宽字符中的
0x00当成字符串结束符,所以只打印出第一个字符D。
另外,你的代码没有检查GetComputerNameW的返回值,建议加上错误判断,方便排查调用失败的情况。
两种解决方式:
方式一:转成多字节字符串输出
把宽字符转成系统默认编码的多字节字符串,再用printf输出:
#include <windows.h> #include <stdio.h> int main() { wchar_t compName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD maxSize = MAX_COMPUTERNAME_LENGTH + 1; BOOL getName = GetComputerNameW(compName, &maxSize); // 检查API调用是否成功 if (!getName) { printf("获取计算机名失败,错误码:%lu\n", GetLastError()); return 1; } // 宽字符转多字节 char mbCompName[MAX_COMPUTERNAME_LENGTH + 1]; int convertResult = WideCharToMultiByte(CP_ACP, 0, compName, -1, mbCompName, sizeof(mbCompName), NULL, NULL); if (convertResult == 0) { printf("字符串转换失败,错误码:%lu\n", GetLastError()); return 1; } printf("Computer name is: %s\n", mbCompName); return 0; }
方式二:设置控制台为宽字符输出模式
直接用Windows API的宽字符输出函数,或者设置控制台代码页为UTF-8后用wprintf:
#include <windows.h> #include <stdio.h> int main() { wchar_t compName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD maxSize = MAX_COMPUTERNAME_LENGTH + 1; BOOL getName = GetComputerNameW(compName, &maxSize); if (!getName) { wprintf(L"获取计算机名失败,错误码:%lu\n", GetLastError()); return 1; } // 获取控制台输出句柄,用宽字符函数直接输出 HANDLE hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); wchar_t outputBuf[256]; swprintf(outputBuf, sizeof(outputBuf)/sizeof(wchar_t), L"Computer name is: %s\n", compName); WriteConsoleW(hConsoleOut, outputBuf, lstrlenW(outputBuf), NULL, NULL); return 0; }
或者也可以通过设置控制台代码页为UTF-8,然后用wprintf输出:
// 在输出前添加这行代码 SetConsoleOutputCP(CP_UTF8); wprintf(L"Computer name is: %s\n", compName);
内容的提问来源于stack exchange,提问作者user2494337
相关产品推荐
相关产品推荐

