58

標準入力からパスワードを読み取る必要がありstd::cin、ユーザーが入力した文字をエコーし​​たくない...

std :: cinからのエコーを無効にするにはどうすればよいですか?

これが私が現在使用しているコードです:

string passwd;
cout << "Enter the password: ";
getline( cin, passwd );

私はこれを行うためのOSにとらわれない方法を探しています。 ここでは、Windowsと*nixの両方でこれを行う方法があります。

4

4 に答える 4

70

@ wrang-wrangの答えは本当に良かったのですが、私のニーズを満たしていませんでした。これが私の最終的なコード(これに基づいていた)のようになります。

#ifdef WIN32
#include <windows.h>
#else
#include <termios.h>
#include <unistd.h>
#endif

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
}

使用例:

#include <iostream>
#include <string>

int main()
{
    SetStdinEcho(false);

    std::string password;
    std::cin >> password;

    SetStdinEcho(true);

    std::cout << password << std::endl;

    return 0;
}
于 2009-09-21T15:09:59.287 に答える
10

このための標準には何もありません。

UNIXでは、端末の種類に応じていくつかのマジックバイトを書き込むことができます。

利用 可能な場合はgetpasswdを使用します。

system()/usr/bin/stty -echoを使用して、エコーを無効にし/usr/bin/stty echo、有効にすることができます(ここでも、UNIXで)。

この男は、「stty」を使用せずにそれを行う方法を説明します。私はそれを自分で試しませんでした。

于 2009-09-11T21:50:22.683 に答える
7

移植性を気にしない場合は、_getch()で使用できますVC

#include <iostream>
#include <string>
#include <conio.h>

int main()
{
    std::string password;
    char ch;
    const char ENTER = 13;

    std::cout << "enter the password: ";

    while((ch = _getch()) != ENTER)
    {
        password += ch;
        std::cout << '*';
    }
}

getwch()もありwide charactersます。私のアドバイスは、システムでもNCurse利用できるものを使用することです。*nix

于 2009-09-11T22:05:37.307 に答える
1

私が何を持っているかを知っているだけで、パスワードをcharごとに読み取ることができ、その後、バックスペース( "\ b")とおそらく'*'を出力します。

于 2009-09-11T21:57:04.160 に答える