我想获取当前进程的用户名。我正在使用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>
这些标题。
有人可以帮忙!
答案 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()
)。数字和下划线是一些可能的附加字符。更好地使用
cout << username;
打印你的字符串。
提示:只有在需要时才进行类型转换,并且只有经过仔细考虑才能确保它实际上是正确的。
答案 2 :(得分:2)
您正在打印UNLEN
个字符并忽略已修改的size
参数,以便获得缓冲区中的乱码。