从std :: cin读取密码

我需要从标准输入读取密码,并希望std::cin不要回显用户键入的字符…

我怎样才能禁用从std :: cin的回声?

这里是我目前使用的代码:

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

我正在寻找一种操作系统不可知的方式来做到这一点。 这里有两种方法可以在Windows和* nix中执行此操作。

@ wrang-wrang答案真的很好,但没有满足我的需求,这是我最终的代码(这是基于这个 )看起来像:

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

示例用法:

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

这个标准没有什么。

在unix中,您可以根据终端类型编写一些魔术字节。

如果可用,请使用getpasswd 。

你可以通过system() /usr/bin/stty -echo来禁用回显,而/usr/bin/stty echo启用它(再次,在unix上)。

这家伙解释如何做到这一点,而不使用“stty”; 我没有自己尝试。

如果你不关心可移植性,你可以在VC使用_getch()

 #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 << '*'; } } 

对于wide characters也有getwch() 。 我的建议是,你使用的NCurse也可以在*nix系统中使用。

只知道我有什么,你可以通过字符读取密码字符,然后只是打印退格(“\ b”),也许'*'。