Question

J'ai besoin de lire un mot de passe depuis l'entrée standard et je voulais que std :: cin ne renvoie pas les caractères saisis par l'utilisateur ...

Comment puis-je désactiver l'écho de std :: cin?

voici le code que j'utilise actuellement:

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

Je cherche un moyen agnostique pour faire cela. Ici , il existe des moyens de le faire dans Windows et * nix.

Était-ce utile?

La solution

La réponse de @ wrang-wrang était vraiment bonne, mais ne répondait pas à mes besoins, c'est ce que mon code final (qui était basé sur this ) ressemble à:

#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
}

Exemple d'utilisation:

#include <iostream>
#include <string>

int main()
{
    SetStdinEcho(false);

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

    SetStdinEcho(true);

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

    return 0;
}

Autres conseils

Il n'y a rien dans la norme pour cela.

Sous Unix, vous pouvez écrire des octets magiques en fonction du type de terminal.

Utilisez getpasswd s'il est disponible. .

Vous pouvez system () / usr / bin / stty -echo pour désactiver l'écho et / usr / bin / stty echo pour l'activer (encore une fois, sous unix ).

Ce mec explique comment procéder sans utiliser "stty"; Je n'ai pas essayé moi-même.

Si vous ne vous souciez pas de la portabilité, vous pouvez utiliser _getch () dans 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 << '*';
    }
}

Il existe également getwch () pour caractères larges . Je vous conseille d'utiliser NCurse disponible dans < code> * nix également.

Seulement idée de ce que j'ai, vous pouvez lire mot de passe char par caractère, et après cela, imprimez simplement un retour arrière ("\ b") et peut-être '*'.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top