Вопрос

Мне нужно прочитать пароль из стандартного ввода и хотел, чтобы std :: cin не отображал символы, набранные пользователем ...

Как я могу отключить эхо от std :: cin?

вот код, который я сейчас использую:

string passwd;
cout << "Enter the password: ";
getline( cin, passwd );

Я ищу независимый от ОС способ сделать это. Здесь есть способы сделать это как в Windows, так и в * nix.

Это было полезно?

Решение

@ wrang-wrang был действительно хорошим ответом, но он не отвечал моим потребностям, это мой окончательный код (основанный на this ) выглядит так:

#ifdef WIN32
#include <windows.h>
#else
#include <termios.h>
#include <unistd.h>
#endif

void SetStdinEcho(bool enable = true)
{
#ifdef WIN32
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); 
    DWORD mode;
    GetConsoleMode(hStdin, &mode);

    if( !enable )
        mode &= ~ENABLE_ECHO_INPUT;
    else
        mode |= ENABLE_ECHO_INPUT;

    SetConsoleMode(hStdin, mode );

#else
    struct termios tty;
    tcgetattr(STDIN_FILENO, &tty);
    if( !enable )
        tty.c_lflag &= ~ECHO;
    else
        tty.c_lflag |= ECHO;

    (void) tcsetattr(STDIN_FILENO, TCSANOW, &tty);
#endif
}

Пример использования:

#include <iostream>
#include <string>

int main()
{
    SetStdinEcho(false);

    std::string password;
    std::cin >> password;

    SetStdinEcho(true);

    std::cout << password << std::endl;

    return 0;
}

Другие советы

В стандарте нет ничего для этого.

В Unix вы можете написать несколько магических байтов в зависимости от типа терминала.

Используйте getpasswd , если он доступен .

Вы можете system () / usr / bin / stty -echo отключить эхо и / usr / bin / stty echo включить его (опять же в unix ).

Этот парень объясняет , как это сделать без использования " stty " ;; Я сам не пробовал.

Если вас не волнует переносимость, вы можете использовать _getch () в VC .

#include <iostream>
#include <string>
#include <conio.h>

int main()
{
    std::string password;
    char ch;
    const char ENTER = 13;

    std::cout << "enter the password: ";

    while((ch = _getch()) != ENTER)
    {
        password += ch;
        std::cout << '*';
    }
}

Существует также getwch () для широких символов . Я советую вам использовать NCurse , который доступен в < системы code> * nix .

Единственная идея, что у меня есть, вы можете прочитать пароль char за символом, а после него просто напечатать backspace (" \ b ") и, возможно, '*'.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top