Скрыть пользовательский ввод при запросе пароля
Возможный дубликат:
Прочитайте пароль из 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, а не С++, но это может вам подойти.
Кроме того, здесь другая ссылка.