Reading a password from std::cin

后端 未结 4 1012
萌比男神i
萌比男神i 2020-11-22 04:46

I need to read a password from standard input and wanted std::cin not to echo the characters typed by the user...

How can I disable the echo from std::c

相关标签:
4条回答
  • 2020-11-22 05:25

    @wrang-wrang answer was really good, but did not fulfill my needs, this is what my final code (which was based on this) look like:

    #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
    }
    

    Sample usage:

    #include <iostream>
    #include <string>
    
    int main()
    {
        SetStdinEcho(false);
    
        std::string password;
        std::cin >> password;
    
        SetStdinEcho(true);
    
        std::cout << password << std::endl;
    
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-22 05:33

    There's nothing in the standard for this.

    In unix, you could write some magic bytes depending on the terminal type.

    Use getpasswd if it's available.

    You can system() /usr/bin/stty -echo to disable echo, and /usr/bin/stty echo to enable it (again, on unix).

    This guy explains how to do it without using "stty"; I didn't try it myself.

    0 讨论(0)
  • 2020-11-22 05:38

    If you don't care about portability, you can use _getch() in 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 << '*';
        }
    }
    

    There is also getwch() for wide characters. My advice is that you use NCurse which is available in *nix systems also.

    0 讨论(0)
  • 2020-11-22 05:38

    Only idea what i have, you could read password char by char, and after it just print backspace ("\b") and maybe '*'.

    0 讨论(0)
提交回复
热议问题