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

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

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


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


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

c&#43;&#43; - 为什么显示笑脸而不是用户名?-LMLPHP

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

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

关于c++ - 为什么显示笑脸而不是用户名?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54099332/

10-11 20:12