문제

표준 입력에서 비밀번호를 읽어야 하는데 원하는 경우 std::cin 사용자가 입력한 문자를 에코하지 않으려면...

std::cin에서 에코를 비활성화하려면 어떻게 해야 합니까?

현재 사용중인 코드는 다음과 같습니다.

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

나는 이 작업을 수행하기 위해 OS에 구애받지 않는 방법을 찾고 있습니다.여기 Windows와 *nix 모두에서 이를 수행하는 방법이 있습니다.

도움이 되었습니까?

해결책

@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;
}

다른 팁

이 표준에는 아무것도 없습니다.

UNIX에서는 터미널 유형에 따라 마법 바이트를 쓸 수 있습니다.

사용 getpasswd 사용할 수있는 경우.

시스템 () 할 수 있습니다. /usr/bin/stty -echo 에코를 비활성화하고 /usr/bin/stty echo (유니 닉스에서) 그것을 활성화합니다.

이 사람은 설명합니다 "Stty"를 사용하지 않고 수행하는 방법; 나는 그것을 직접 시도하지 않았다.

이식성에 관심이 없다면 사용할 수 있습니다. _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 시스템도.

내가 가진 것만 생각하면 암호 문자를 문자별로 읽을 수 있고 그 후에는 백스페이스("\b")와 '*'를 인쇄할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top