58 votes

Lire un mot de passe à partir de std::cin

J'ai besoin de lire un mot de passe à partir de l'entrée standard et voulait std::cin pas l'écho des caractères tapés 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 );

Edit: je suis à la recherche d'un OS de façon agnostique pour ce faire. Ici il y a des façons de le faire dans les deux Windows et *nix.

70voto

Vargas Points 937

@wrang-wrang réponse a été vraiment bon, mais ne répond pas à mes besoins, c'est ce que mon code final (qui était fondée sur cette) ressembler à:

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
}

10voto

Jonathan Graehl Points 6460

Il n'y a rien dans la norme de ce.

Sous unix, vous pouvez écrire un peu de magie octets en fonction du type de terminal.

Utilisation getpasswd si elle 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, sur unix).

Ce mec explique comment le faire sans l'aide de "stty"; je ne l'ai pas essayé moi-même.

7voto

AraK Points 38702

Si vous n'avez pas de soins sur la portabilité, vous pouvez utiliser _getch() en 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 est également getwch() pour wide characters. Mon conseil est que vous utilisez NCurse qui est disponible en *nix systèmes aussi.

2voto

ProblemFactory Points 4470

Seulement idée de ce que j'ai, vous avez pu lire le mot de passe char par char, et après il suffit d'imprimer la touche retour arrière ("\b") et peut-être '*'.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X