为什么显示笑脸而不是用户名?

时间:2019-01-08 20:36:09

标签: c++

为什么显示笑脸而不是用户名?

更改控制台属性没有帮助...

#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();
}

结论:☺

1 个答案:

答案 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,在您的平台上是1BOOLint,可以将其强制为char。因此,编译器在operator=(char)上调用std::string方法,将char 0x01写入std::string并将其长度设置为1:

  

字符串值设置为此字符的单个副本(字符串长度变为1)。

回顾一下,您要为std::string分配字符代码0x01。我假设您正在Windows命令提示符下运行代码,该命令使用从DOS代码页437派生的编码。这是其字符映射表:

character map

左上角是代码0。您在它旁边看到了什么? (提示:0到1之后)。

P.S .:在Windows上,您可以通过按住 Alt 并键入字符代码来键入CP437的任何字符。 Alt + 1 将使您通过运行程序得到笑脸。