【问题标题】:Hide user input on password prompt [duplicate]在密码提示中隐藏用户输入[重复]
【发布时间】:2011-10-17 11:03:55
【问题描述】:

可能重复:
Read a password from std::cin

我不能正常使用控制台,所以我的问题可能很容易回答或不可能做到。

是否可以“解耦”cincout,这样我在控制台中输入的内容就不会再次直接出现在其中?

我需要这个来让用户输入密码,而我和用户通常都不希望他的密码出现在屏幕上的 plaintext 中。

我尝试在stringstream 上使用std::cin.tie,但我输入的所有内容仍然反映在控制台中。

【问题讨论】:

标签: c++ console iostream cout cin


【解决方案1】:

来自How to Hide Text

Windows

#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

int main()
{
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); 
    DWORD mode = 0;
    GetConsoleMode(hStdin, &mode);
    SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT));

    string s;
    getline(cin, s);

    cout << s << endl;
    return 0;
}//main 

清理:

SetConsoleMode(hStdin, mode);

tcsetattr(STDIN_FILENO, TCSANOW, &oldt);

Linux

#include <iostream>
#include <string>
#include <termios.h>
#include <unistd.h>

using namespace std;

int main()
{
    termios oldt;
    tcgetattr(STDIN_FILENO, &oldt);
    termios newt = oldt;
    newt.c_lflag &= ~ECHO;
    tcsetattr(STDIN_FILENO, TCSANOW, &newt);

    string s;
    getline(cin, s);

    cout << s << endl;
    return 0;
}//main 

【讨论】:

  • tcsetattr(STDIN_FILENO, TCSANOW, &amp;oldt); 也是 Linuz 清理所必需的。
【解决方案2】:

您实际上是在问两个不相关的问题。
调用 cin.tie( NULL )std::cinstd::cout 解耦 完全地。但它不会影响较低级别的任何内容。而在最低级别,至少在Windows和Unix下,std::cinstd::cout都连接到系统级别的同一个设备,并且是那个设备(Unix下的/dev/tty)进行回显;您甚至可以将标准输出重定向到文件,控制台仍会回显输入。

如何关闭此回显取决于系统;最简单的解决方案可能是使用某种第三方库,例如 curses 或 ncurses,它提供了更高级别的接口,并隐藏了所有系统依赖项。

【讨论】:

    【解决方案3】:

    使用getch() 获取输入而不是使用cin,因此不会显示输入(引用wiki):

    int getch(void) 直接从控制台读取一个字符 缓冲区,并且没有回声。

    这确实是 C,而不是 C++,但它可能适合你。

    另外,这里还有another link

    【讨论】:

      猜你喜欢
      • 2020-03-19
      • 2021-07-03
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-06-14
      • 2021-08-09
      • 2012-04-25
      • 2021-04-17
      相关资源
      最近更新 更多