Вопрос:

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

c++ console iostream cout cin

34078 просмотра

3 ответа

5484 Репутация автора

Возможно дублирование:
чтение пароля из std :: cin

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

Можно ли «разъединить» cinи cout, чтобы то, что я ввожу в консоль, больше не появлялось прямо в ней?

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

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

Автор: dom0 Источник Размещён: 01.08.2011 01:23

Ответы (3)


3 плюса

20989 Репутация автора

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

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

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

Также здесь есть еще одна ссылка .

Автор: zw324 Размещён: 01.08.2011 01:26

36 плюса

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
Вопросы из категории :
32x32