Lendo uma senha de std :: cin
-
06-07-2019 - |
Pergunta
Eu preciso ler uma senha de entrada padrão e std::cin
queria não ecoar os caracteres digitados pelo usuário ...
Como posso desativar o eco de std :: cin?
aqui está o código que estou usando atualmente:
string passwd;
cout << "Enter the password: ";
getline( cin, passwd );
Eu estou procurando uma maneira OS agnóstico para fazer isso. Aqui existem maneiras de fazer isso no Windows e * nix.
Solução
@ wrang-wrang foi muito bom, mas não cumpriu as minhas necessidades, isto é o meu código final (que foi baseado em este ) olhar como:
#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
}
Exemplo 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;
}
Outras dicas
Não há nada no padrão para isso.
Em unix, você poderia escrever um pouco de magia bytes dependendo do tipo de terminal.
Use getpasswd se ele estiver disponível .
Você pode system () /usr/bin/stty -echo
para desativar eco, e /usr/bin/stty echo
para habilitá-lo (novamente, em unix).
Esse cara explica como fazê-lo sem o uso de "stty"; Eu não tentei isso sozinho.
Se você não se preocupam com a portabilidade, você pode usar _getch()
em 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 << '*';
}
}
Há também getwch()
para wide characters
. Meu conselho é que você use NCurse
que está disponível em sistemas *nix
também.
Apenas idéia do que eu tenho, você poderia ler caractere senha char, e depois de apenas imprimir retrocesso ( "\ b") e talvez '*'.