Скрыть ввод пользователя в строке пароля [дубликат]


Возможный дубликат:
считывание пароля из std:: cin

Я обычно не работаю с консолью, поэтому на мой вопрос, возможно, очень легко ответить или невозможно сделать .

Можно ли "развязать" cin и cout, Чтобы то, что я ввожу в консоль, не появлялось непосредственно в ней снова?

Мне это нужно, чтобы позволить пользователю ввести пароль, и ни я, ни пользователь обычно не хотят, чтобы его пароль появился в plaintext на экране. экран.

Я пробовал использовать std::cin.tie на stringstream, но все, что я печатаю, по-прежнему отражается в консоли.

3 15

3 ответа:

Из Как Скрыть текст:

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 

Вы действительно спрашиваете о двух несвязанных вопросах.
Вызов cin.tie( NULL ) развязок std::cin и std::cout полностью. Но на более низком уровне это ни на что не влияет. И на самом низком уровне, по крайней мере под Windows и Unix, std::cin и std::cout оба подключены к одному и тому же устройству на системном уровне, и именно это устройство (/dev/tty под Unix) делает Эхо; вы даже можете перенаправить стандартный выход в файл, и консоль все равно будет Эхо-вход.

То, как вы отключаете это эхо, зависит от самое простое решение, вероятно, использовать какую-то стороннюю библиотеку, например curses или ncurses, которая обеспечивает интерфейс более высокого уровня и скрывает все системные зависимости.

Использование getch() чтобы получить входные данные вместо использования cin, поэтому входные данные не будут показаны (цитирую wiki):

Int getch (void) считывает символ непосредственно из консоли без буфер, и без эха.

Это действительно C, а не C++, но это может вам подойти.

Кроме того, здесь есть Еще одна ссылка.