18

可能重复:
从 std::cin 读取密码

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

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

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

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

4

3 回答 3

38

如何隐藏文本

视窗

#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 
于 2011-08-01T13:27:13.420 回答
5

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

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

于 2011-08-01T13:36:55.837 回答
4

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

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

这实际上是 C,而不是 C++,但它可能适合您。

此外,这里还有另一个链接

于 2011-08-01T13:26:58.443 回答