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

时间:2014-03-21 20:19:51

标签: c++ windows-7 username

我想获取当前进程的用户名。我正在使用winapi标准GetUsername函数:

TCHAR username[UNLEN + 1];
DWORD size = UNLEN + 1;
GetUserName((TCHAR*)username, &size);

并按照以下方式打印:

for(int i = 0; i <= UNLEN; i++) if(isalpha(username[i])) cout << (char)(username[i]);

但输出

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

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

#include <Windows.h>
#include <Lmcons.h>
#include <iostream>
#include <ctype.h>
#include <string>

这些标题。

有人可以帮忙!

3 个答案:

答案 0 :(得分:5)

而不是

for(int i = 0; i <= UNLEN; i++) if(isalpha(username[i])) cout << (char)(username[i]);

你应该说

for(int i = 0; i <= size; i++) if(isalpha(username[i])) cout << (char)(username[i]);

因为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数,包括终止空字符

答案 1 :(得分:3)

调用之后,缓冲区username包含一个长度为size-1的以0结尾的字符串。超过终止0的任何字节都是任意垃圾。您的代码取决于这些错误的前提:

  • 用户名仅包含字母(isalpha())。数字和下划线是一些可能的附加字符。
  • 将字符串零填充到缓冲区长度。实际上,任何垃圾都可能跟在字符串后面。
  • TCHAR是char。你确定UNICODE和_UNICODE都没有定义吗?

更好地使用

    cout << username;

打印你的字符串。

提示:只有在需要时才进行类型转换,并且只有经过仔细考虑才能确保它实际上是正确的。

答案 2 :(得分:2)

您正在打印UNLEN个字符并忽略已修改的size参数,以便获得缓冲区中的乱码。