18

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

私は通常、コンソールで作業していないので、私の質問はおそらく非常に簡単に答えられるか、答えられないでしょう.

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

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

で使用std::cin.tieしてみましたstringstreamが、入力したものはすべてコンソールにミラーリングされたままです。

4

3 に答える 3

38

テキストを非表示にする方法から:

ウィンドウズ

#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 
于 2011-08-01T13:27:13.420 に答える
5

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

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

于 2011-08-01T13:36:55.837 に答える
4

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

int getch(void) バッファもエコーも使わずに、コンソールから直接文字を読み取ります。

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

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

于 2011-08-01T13:26:58.443 に答える