Pytanie Ukryj dane wprowadzane przez użytkownika po monicie hasła [duplicate]


Możliwe duplikaty:
Przeczytaj hasło ze std :: cin 

Nie pracuję normalnie z konsolą, więc moje pytanie może być bardzo łatwe do odpowiedzi lub niemożliwe do zrobienia.

Czy możliwe jest "rozłączenie" cin i cout, więc to, co wpisuję w konsoli, nie pojawia się bezpośrednio w nim?

Potrzebuję tego, aby umożliwić użytkownikowi wpisanie hasła, a ani ja, ani użytkownik zwykle nie chce, aby jego hasło pojawiło się w plaintext na ekranie.

Próbowałem użyć std::cin.tie na stringstream, ale wszystko, co wpisuję, jest nadal odbijane w konsoli.


15
2017-08-01 13:23


pochodzenie


Zobacz też: github.com/Seldaek/hidden-input - mauris


Odpowiedzi:


Od Jak ukryć tekst:

Windows

#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 

sprzątać:

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 

34
2017-08-01 13:27



tcsetattr(STDIN_FILENO, TCSANOW, &oldt); jest również wymagane do sprzątania w Linuz. - Bugalugs Nash


Naprawdę pytasz o dwa niezwiązane ze sobą problemy.
Powołanie cin.tie( NULL ) rozdzielać std::cin i std::cout całkowicie. Ale nie wpływa to na nic na niższym poziomie. I na najniższym poziomie, przynajmniej pod Windows i Unixem, std::cin i std::cout są podłączone do tego samego urządzenia na poziomie systemu, i to jest to urządzenie (/dev/tty w systemie Unix), który wykonuje echo; możesz nawet przekierować standard do pliku, a konsola będzie nadal wyświetlać echo.

Sposób wyłączenia tego echa zależy od systemu; najprostszym rozwiązaniem jest prawdopodobnie użycie jakiejś biblioteki strony trzeciej, takiej jak curses lub ncurses, która zapewnia wyższy poziom interfejsu i ukrywa wszystkie zależności systemu.


5
2017-08-01 13:36





Posługiwać się getch() aby uzyskać dane wejściowe zamiast używać cin, więc dane wejściowe nie będą wyświetlane (cytując wiki):

int getch (void) Czyta postać bezpośrednio z konsoli bez   bufor i bez echa.

To jest naprawdę C, nie C ++, ale może ci odpowiadać.

Jest też inny link tutaj.


3
2017-08-01 13:26