windows 7 - c++ GetUserName()返回用户名和乱码
windows 7 - C++ GetUserName() returning username and gibberish
我想获得当前进程的用户名。我使用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]);
但输出
尼基╕♣■scm +♣■pα┬p♠■≡我■└M♣■╧*■╔■♣y(♣♣(♣♣♣♣T♣@♣3♣■┐
Nicki
是我正在测试的系统的用户名。我不知道我做错了什么。它可以很好地编译,并且我包含了
#include <Windows.h>
#include <Lmcons.h>
#include <iostream>
#include <ctype.h>
#include <string>
这些头。有人能帮帮我吗?
代替
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]在输入时,该变量指定lpBuffer缓冲区的大小(以tchar表示)。在输出时,变量接收复制到缓冲区的tchar的数量,包括结束的空字符。
调用之后,缓冲区username
包含一个长度为size-1
的以0结尾的字符串。任何超过终止0的字节都是任意垃圾。你的代码依赖于这些错误的前提:
- 用户名只包含字母(
isalpha()
)。数字和下划线是一些可能的附加字符。 - 字符串被零填充到缓冲区长度。实际上,任何任意的垃圾都可能跟在字符串后面。
- char是字符。您确定UNICODE和_UNICODE都没有定义吗?
更好地利用
cout << username;
打印字符串。
提示:只有在需要时才进行类型强制转换,并且要仔细考虑确保它实际上是正确的。
您正在打印UNLEN
字符并忽略修改的size
参数,因此您得到缓冲区中的乱码
相关文章:
- 用户定义的转换无法指定返回类型
- 当模板返回类型阻止其实例化时,如何向用户提供漂亮的static_assert消息?
- C++ :: 返回用户输入的函数,直到按下回车键
- 从 QAbstractItemModel 返回自定义用户类型
- 为什么用户定义的转换函数模板不能有推导的返回类型?
- 重载运算符返回什么类型的值(对于用户定义的类型):右值还是左值?
- 模拟返回具有多个用户定义转换的类型的方法
- JNI:返回用户定义的Java类时要使用什么签名
- 为什么基元类型和用户定义类型在从函数返回为"const"时的行为不同?
- 彩票模拟器正在返回垃圾价值,而不是用户乐透数字和获胜数字
- CPU寄存器中返回的用户定义类型的C 对象.实例方法如何工作
- 如何将具有空间的用户输入并将其返回到字符串中
- 我需要在接受用户输入后返回 c 刺痛中的单词数
- 需要帮助按 "enter or new line" 以允许用户返回主菜单
- 用户定义功能的返回值的分配:性能
- C++ cin 无论用户输入什么,都返回 0 作为整数
- 如何将用户返回到模拟前的状态
- API返回类型--强制将智能指针指向用户
- 如何让C++课"return"有能力?(或用户定义类型的返回动态)
- 创建进程为用户返回错误代码 2