从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”),也许'*'。