web-dev-qa-db-ja.com

パスワードプロンプトでユーザー入力を非表示にする

重複の可能性:
std :: cinからパスワードを読み取ります

私はコンソールで正常に動作しないので、私の質問は答えるのが非常に簡単であるか、できないかもしれません。

cincoutを「分離」して、コンソールに入力した内容がコンソールに直接表示されないようにすることはできますか?

これは、ユーザーがパスワードを入力できるようにするために必要です。通常、私もユーザーも、画面のplaintextにパスワードが表示されることを望んでいません。

stringstreamstd::cin.tieを使用しようとしましたが、入力したものはすべてコンソールにミラーリングされています。

16
dom0

From テキストを非表示にする方法

Windows

#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 
36
user195488

あなたは本当に2つの無関係な問題について尋ねています。
cin.tie( NULL )を呼び出すと、std::cinstd::coutが完全に分離されます。しかし、それは下位レベルでは何にも影響しません。そして、最下位レベルでは、少なくともWindowsとUnixでは、std::cinstd::coutは両方ともシステムレベルで同じデバイスに接続されており、それがそのデバイスです(Unixでは/dev/tty)これはエコーを行います。標準をファイルにリダイレクトすることもでき、コンソールは引き続き入力をエコーし​​ます。

このエコーをオフにする方法は、システムによって異なります。最も簡単な解決策は、cursesやncursesなどのサードパーティライブラリを使用することです。これは、より高いレベルのインターフェイスを提供し、すべてのシステム依存関係を非表示にします。

5
James Kanze

cinを使用する代わりに getch() を使用して入力を取得すると、入力は表示されません(wikiを引用):

int getch(void)バッファーなしでエコーなしでコンソールから直接文字を読み取ります。

これは実際にはC++ではなくCですが、あなたに合うかもしれません。

また、 別のリンク ここにあります。

3
zw324