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