Pregunta

Necesito leer una contraseña de la entrada estándar y quería std :: cin para no hacer eco de los caracteres escritos por el usuario ...

¿Cómo puedo desactivar el eco de std :: cin?

aquí está el código que estoy usando actualmente:

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

Estoy buscando una forma agnóstica de SO para hacer esto. Aquí hay formas de hacerlo tanto en Windows como en * nix.

¿Fue útil?

Solución

La respuesta de @ wrang-wrang fue realmente buena, pero no satisfizo mis necesidades, este es mi código final (que se basó en esto ) se parece a:

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

Ejemplo de uso:

#include <iostream>
#include <string>

int main()
{
    SetStdinEcho(false);

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

    SetStdinEcho(true);

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

    return 0;
}

Otros consejos

No hay nada en el estándar para esto.

En Unix, podría escribir algunos bytes mágicos dependiendo del tipo de terminal.

Utilice getpasswd si está disponible .

Puede sistema () / usr / bin / stty -echo para deshabilitar echo, y / usr / bin / stty echo para habilitarlo (nuevamente, en unix ).

Este chico explica cómo hacerlo sin usar '' stty ''; No lo intenté yo mismo.

Si no le importa la portabilidad, puede usar _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 << '*';
    }
}

También hay getwch () para caracteres anchos . Mi consejo es que use NCurse que está disponible en < sistemas code> * nix también.

Solo idea de lo que tengo, puedes leer la contraseña char por char, y después de eso solo imprime retroceso (" \ b ") y tal vez '*'.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top