標準入力からのユーザー入力の非表示
標準入力からパスワードなどの機密情報を取得する場合、入力された文字を表示することは望ましくありません。この記事では、入力中の文字エコーを無効にするプラットフォームに依存しない方法について説明します。
コード例
次のコード スニペットを考えてみましょう。
string passwd; cout << "Enter the password: "; getline(cin, passwd);
これこのコードではユーザーにパスワードの入力を求めますが、入力した文字は表示されます。ユーザー入力を隠すために、以下に概説するプラットフォーム固有の手法を採用しています。
プラットフォーム固有のソリューション
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 中国語 Web サイトの他の関連記事を参照してください。