Скрыть ввод пользователя в строке пароля [дубликат]
Я обычно не работаю с консолью, поэтому на мой вопрос, возможно, очень легко ответить или невозможно сделать .Возможный дубликат:
считывание пароля из std:: cin
Можно ли "развязать" cin
и cout
, Чтобы то, что я ввожу в консоль, не появлялось непосредственно в ней снова?
Мне это нужно, чтобы позволить пользователю ввести пароль, и ни я, ни пользователь обычно не хотят, чтобы его пароль появился в plaintext
на экране. экран.
Я пробовал использовать std::cin.tie
на stringstream
, но все, что я печатаю, по-прежнему отражается в консоли.
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++, но это может вам подойти.
Кроме того, здесь есть Еще одна ссылка.