Ich muss ein Passwort aus der Standardeingabe lesen und wollte std::cin
um die vom Benutzer eingegebenen Zeichen nicht zu wiederholen …
Wie kann ich das Echo von std::cin deaktivieren?
Hier ist der Code, den ich derzeit verwende:
string passwd;
cout << "Enter the password: ";
getline( cin, passwd );
Ich suche nach einem OS-unabhängigen Weg, dies zu tun.
Hier Es gibt Möglichkeiten, dies sowohl in Windows als auch in * nix zu tun.
@wrang-wrang Antwort war wirklich gut, hat aber meine Bedürfnisse nicht erfüllt, das ist mein endgültiger Code (der auf basierte Das) aussehen:
#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
}
Beispielverwendung:
#include <iostream>
#include <string>
int main()
{
SetStdinEcho(false);
std::string password;
std::cin >> password;
SetStdinEcho(true);
std::cout << password << std::endl;
return 0;
}

Jonathan Grähl
In der Norm steht dazu nichts.
Unter Unix könnten Sie je nach Terminaltyp einige magische Bytes schreiben.
Verwenden getpasswd wenn es verfügbar ist.
Sie können system() /usr/bin/stty -echo
Echo zu deaktivieren, und /usr/bin/stty echo
um es zu aktivieren (wieder unter Unix).
Dieser Typ erklärt wie man es macht, ohne “stty” zu verwenden; Ich habe es nicht selbst probiert.
Wenn Sie sich nicht um Portabilität kümmern, können Sie verwenden _getch()
in 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 << '*';
}
}
Es gibt auch getwch()
zum wide characters
. Mein Rat ist, dass Sie verwenden NCurse
die erhältlich ist *nix
Systeme auch.
Nur eine Idee, was ich habe, Sie könnten das Passwort Zeichen für Zeichen lesen und danach einfach die Rücktaste (“\ b”) und vielleicht ‘*’ drucken.
9950900cookie-checkLesen eines Passworts von std::cinyes
stackoverflow.com/questions/13687769/…
– Daniel Weber
3. Dezember 2012 um 17:07 Uhr