从标准输入中隐藏用户输入
从标准输入检索密码等敏感信息时,显示键入的字符是不可取的。本文探讨了在输入过程中禁用字符回显的与平台无关的方法。
代码示例
考虑以下代码片段:
string passwd; cout << "Enter the password: "; getline(cin, passwd);
This代码提示用户输入密码,但键入的字符会明显显示。为了隐藏用户输入,我们采用下面概述的特定于平台的技术。
特定于平台的解决方案
Windows
#ifdef WIN32 #include <windows.h>
在Windows系统中,SetConsoleMode可用于切换字符回显。通过将 ENABLE_ECHO_INPUT 设置为 0 来禁用回显:
SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), mode & ~ENABLE_ECHO_INPUT);
Linux/macOS
#else #include <termios.h>
对于 Linux 和 macOS 系统,使用 tcgetattr 和 tcsetattr 来检索和更新终端设置。通过清除 c_lflag 字段中的 ECHO 位来禁用回显:
tty.c_lflag &^= ECHO; tcsetattr(STDIN_FILENO, TCSANOW, &tty);
最终代码
结合这些技术,以下代码提供了一个跨平台解决方案来禁用输入密码时回显字符:
#include <iostream> #include <string> 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 } int main() { SetStdinEcho(false); std::string password; std::cin >> password; SetStdinEcho(true); std::cout << password << std::endl; return 0; }
以上是如何在密码输入期间隐藏控制台中的用户输入?的详细内容。更多信息请关注PHP中文网其他相关文章!