std::cin에서 비밀번호 읽기
-
06-07-2019 - |
문제
표준 입력에서 비밀번호를 읽어야 하는데 원하는 경우 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")와 '*'를 인쇄할 수 있습니다.
제휴하지 않습니다 StackOverflow