为什么显示笑脸而不是用户名?
更改控制台属性没有帮助...
#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();
}
结论:☺
最佳答案
看一下该函数的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)。
回顾一下,您正在将字符代码0x01分配给
std::string
。我假设您正在Windows命令提示符中运行代码,该命令使用从DOS代码页437派生的编码。这是它的字符映射:左上角是代码0。您在代码旁边看到了什么? (提示:0之后为1)。
附注:在Windows上,您可以通过按住Alt键并输入字符代码来键入CP437的任何字符。 Alt + 1将使您通过运行程序得到笑脸。
关于c++ - 为什么显示笑脸而不是用户名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54099332/