C++ GetUserName()返回用户名和乱码

nim*_*son 1 c++ username windows-7

我想获取当前进程的用户名.我正在使用winapi标准GetUsername函数,如下所示:

TCHAR username[UNLEN + 1];
DWORD size = UNLEN + 1;
GetUserName((TCHAR*)username, &size);
Run Code Online (Sandbox Code Playgroud)

并像这样打印:

for(int i = 0; i <= UNLEN; i++) if(isalpha(username[i])) cout << (char)(username[i]);
Run Code Online (Sandbox Code Playgroud)

但它输出

Nickiê╕╕■scm +♣■pα┬p♠■≡î■MM♣■╧*■╔■♣ÿ(♣♣(♣♣♣♣T♣@♣3♣■┐

Nicki是我正在测试的系统的用户名.我不知道我做错了什么.编译很好,我包括在内

#include <Windows.h>
#include <Lmcons.h>
#include <iostream>
#include <ctype.h>
#include <string>
Run Code Online (Sandbox Code Playgroud)

这些标题.

有人可以帮忙!

Cor*_*mer 5

代替

for(int i = 0; i <= UNLEN; i++) if(isalpha(username[i])) cout << (char)(username[i]);
Run Code Online (Sandbox Code Playgroud)

你应该说

for(int i = 0; i <= size; i++) if(isalpha(username[i])) cout << (char)(username[i]);
Run Code Online (Sandbox Code Playgroud)

因为GetUserName计算出实际用户名的长度并将其传递给size(这就是它通过引用传递的原因).完整的username数组是257个元素长,所以它会让你cout所有这些,其中大部分都是无稽之谈.

从MSDN站点:http://msdn.microsoft.com/en-us/library/windows/desktop/ms724432%28v=vs.85%29.aspx

lpnSize [in,out]在输入时,此变量在TCHAR中指定lpBuffer缓冲区的大小.在输出时,变量接收复制到缓冲区的TCHAR数,包括终止空字符.