为什么显示笑脸而不是用户名?
更改控制台属性没有帮助...
#include "pch.h"
#include <windows.h>
#include <Lmcons.h>
#include <string>
#include <iostream>
std::string UserName() {
TCHAR username[UNLEN + 1];
DWORD size = UNLEN + 1;
std::string UserName1;
UserName1 = GetUserName((TCHAR*)username, &size);
std::cout << UserName1 << std::endl;
return UserName1;
}
int main()
{
UserName();
}
结论:☺
答案 0 :(得分:10)
看看该函数的MSDN documentation。签名是
BOOL GetUserNameA(
LPSTR lpBuffer,
LPDWORD pcbBuffer
);
函数的返回值为BOOL
,如果函数成功,则返回值为非零。它不返回字符串。您传递给username
参数的lpBuffer
缓冲区将包含用户名:
std::string UserName() {
char username[UNLEN + 1];
DWORD size = UNLEN + 1;
std::string UserName1;
if (GetUserNameA(username, &size))
UserName1.assign(username, size-1);
std::cout << UserName1 << std::endl;
return UserName1;
}
为何显示笑脸,原因很简单:该函数恰巧返回TRUE
,在您的平台上是1
。 BOOL
是int
,可以将其强制为char
。因此,编译器在operator=(char)
上调用std::string
方法,将char
0x01写入std::string
并将其长度设置为1:
字符串值设置为此字符的单个副本(字符串长度变为1)。
回顾一下,您要为std::string
分配字符代码0x01。我假设您正在Windows命令提示符下运行代码,该命令使用从DOS代码页437派生的编码。这是其字符映射表:
左上角是代码0。您在它旁边看到了什么? (提示:0到1之后)。
P.S .:在Windows上,您可以通过按住 Alt 并键入字符代码来键入CP437的任何字符。 Alt + 1 将使您通过运行程序得到笑脸。