Leyendo una contraseña de std :: cin
-
06-07-2019 - |
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.
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 '*'.