可能重复:
从 std::cin 读取密码
我不能正常使用控制台,所以我的问题可能很容易回答或不可能做到。
是否可以“解耦” cin
and cout
,以便我在控制台中输入的内容不会再次直接出现在其中?
我需要这个来让用户输入密码,而我和用户通常都不希望他的密码出现在plaintext
屏幕上。
我尝试std::cin.tie
在 a 上使用stringstream
,但我输入的所有内容仍然反映在控制台中。
从如何隐藏文本:
视窗
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode = 0;
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT));
string s;
getline(cin, s);
cout << s << endl;
return 0;
}//main
清理:
SetConsoleMode(hStdin, mode);
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
Linux
#include <iostream>
#include <string>
#include <termios.h>
#include <unistd.h>
using namespace std;
int main()
{
termios oldt;
tcgetattr(STDIN_FILENO, &oldt);
termios newt = oldt;
newt.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
string s;
getline(cin, s);
cout << s << endl;
return 0;
}//main
你真的在问两个不相关的问题。
调用完全cin.tie( NULL )
解耦
。但它不会影响较低级别的任何内容。并且在最低级别,至少在 Windows 和 Unix 下,并且都连接到系统级别的同一设备,并且是该设备(在 Unix 下)进行回显;您甚至可以将标准输出重定向到文件,控制台仍会回显输入。std::cin
std::cout
std::cin
std::cout
/dev/tty
如何关闭此回声取决于系统;最简单的解决方案可能是使用某种第三方库,例如 curses 或 ncurses,它提供了更高级别的接口,并隐藏了所有系统依赖项。