在密码提示上隐藏用户输入

dom*_*om0 16 c++ console iostream cout cin

可能重复:
从std :: cin读取密码

我不能正常使用控制台,所以我的问题可能很容易回答或无法做到.

是否有可能"脱钩" cincout,让我输入到调音台不直接在它再次出现?

我需要这个让用户输入密码,我和用户通常都不希望他的密码出现在plaintext屏幕上.

我尝试使用std::cin.tiea stringstream,但我输入的所有内容仍然在控制台中镜像.

小智 36

如何隐藏文字:

视窗

#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 
Run Code Online (Sandbox Code Playgroud)

清理:

SetConsoleMode(hStdin, mode);

tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
Run Code Online (Sandbox Code Playgroud)

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 
Run Code Online (Sandbox Code Playgroud)

  • `tcsetattr(STDIN_FILENO,TCSANOW,&oldt);`也是Linuz清理所必需的. (3认同)

Jam*_*nze 5

你真的在问两个不相关的问题.
调用cin.tie( NULL )解耦std::cinstd::cout 完全.但它不会影响较低级别的任何事情.并且在最低级别,至少在Windows和Unix下,std::cin并且std::cout都在系统级别连接到同一设备,并且正是该设备(/dev/tty在Unix下)进行回声; 您甚至可以将标准重定向到文件,控制台仍然会回显输入.

你如何关闭这种回声取决于系统; 最简单的解决方案可能是使用某种第三方库,如curses或ncurses,它提供更高级别的接口,并隐藏所有系统依赖项.