Скрыть ввод пользователя при вводе пароля
34078 просмотра
3 ответа
5484 Репутация автора
Возможно дублирование:
чтение пароля из std :: cin
Я не работаю нормально с консолью, поэтому мой вопрос может быть очень простым или невозможным.
Можно ли «разъединить» cin
и cout
, чтобы то, что я ввожу в консоль, больше не появлялось прямо в ней?
Это нужно для того, чтобы пользователь мог ввести пароль, и ни я, ни пользователь обычно не хотят, чтобы его пароль появлялся plaintext
на экране.
Я попытался использовать std::cin.tie
на a stringstream
, но все, что я печатаю, все еще отражается в консоли.
Ответы (3)
3 плюса
20989 Репутация автора
Используйте getch()
для получения ввода вместо использования cin
, поэтому ввод не будет отображаться (цитирование вики):
int getch (void) Читает символ непосредственно из консоли без буфера и без эха.
Это действительно C, а не C ++, но он может подойти вам.
Также здесь есть еще одна ссылка .
Автор: zw324 Размещён: 01.08.2011 01:2636 плюса
0 Репутация автора
От Как скрыть текст :
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
Автор: user195488
Размещён: 01.08.2011 01:27
5 плюса
133469 Репутация автора
Вы действительно спрашиваете о двух не связанных вопросах.
Зовет cin.tie( NULL )
развязаться std::cin
и std::cout
полностью. Но это ни на что не влияет на более низком уровне. И на самом низком уровне, по крайней мере, под Windows и Unix, std::cin
и std::cout
оба подключены к одному и тому же устройству на системном уровне, и именно это устройство ( /dev/tty
под Unix) выполняет эхо; Вы даже можете перенаправить стандартный файл в файл, и консоль будет по-прежнему отображать ввод.
Как вы отключите это эхо, зависит от системы; самое простое решение, вероятно, состоит в том, чтобы использовать какую-то стороннюю библиотеку, такую как curses или ncurses, которая обеспечивает интерфейс более высокого уровня и скрывает все системные зависимости.
Автор: James Kanze Размещён: 01.08.2011 01:36Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- console Console.WriteLine и общий список
- console Как запустить интерактивную консоль для Perl?
- console Capturing console output from a .NET application (C#)
- console Как получить консольный вывод в C ++ с помощью программы Windows?
- iostream Можете ли вы объяснить концепцию потоков?
- iostream Как вывести двойное значение с полной точностью, используя cout?
- iostream Java IO implementation of unix/linux "tail -f"
- iostream Восстановите состояние std :: cout после манипулирования им
- cout Как я могу дополнить int начальными нулями при использовании оператора cout <<?
- cout Как откатить строки из cout?
- cout Проверьте, является ли объект ostream cout или ofstream, c ++
- cin Нажмите Enter, чтобы продолжить
- cin Получение ввода от пользователя, использующего cin
- cin Как проверить пользовательский ввод как двойной в C ++?
- cin std :: cin.getline () против std :: cin