Leyendo una contraseña de std :: cin

Necesito leer una contraseña de entrada estándar y quería que std::cin no repitiera 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 manera agnóstica del sistema operativo para hacer esto. Aquí hay formas de hacerlo en Windows y * nix.

La respuesta de @ wrang-wrang fue realmente buena, pero no satisfizo mis necesidades, así es como se ve mi código final (que se basa en esto ):

 #ifdef WIN32 #include  #else #include  #include  #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 } 

Uso de muestra:

 #include  #include  int main() { SetStdinEcho(false); std::string password; std::cin >> password; SetStdinEcho(true); std::cout << password << std::endl; return 0; } 

No hay nada en el estándar para esto.

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

Use getpasswd si está disponible.

Puede system () /usr/bin/stty -echo para desactivar echo, y /usr/bin/stty echo para habilitarlo (de nuevo, 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  #include  #include  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 wide characters . Mi consejo es que uses NCurse que también está disponible en los sistemas *nix .

Solo tengo idea de lo que tengo, puedes leer la contraseña char por char, y luego simplemente imprimir el espacio de retroceso (“\ b”) y tal vez ‘*’.