Скрыть пользовательский ввод при запросе пароля

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

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

Можно ли "развязать" cin и cout, так что то, что я набираю в консоль, не появляется прямо в нем снова?

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

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

Ответ 1

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

Окно

#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 

Ответ 2

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

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

Ответ 3

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

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

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

Кроме того, здесь другая ссылка.