2011-08-01 17 views
12

Powiel możliwe:
Read a password from std::cinUkryj dane wprowadzone przez użytkownika hasło poprosi

nie działać normalnie z konsoli, więc moje pytanie jest może bardzo łatwo odpowiedzieć lub niemożliwe do zrobienia .

Czy można "rozłączyć" cin i cout, aby to, co wpisuję w konsoli, nie pojawiło się bezpośrednio w nim ponownie?

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ę na ekranie na plaintext.

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

+0

Zobacz także: https://github.com/Seldaek/hidden-input – mauris

Odpowiedz

29

Od How to Hide Text:

Okna

#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 

porządki:

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 
+2

'tcsetattr (STDIN_FILENO, TCSANOW, &oldt);' jest wymagane do czyszczenia w Linuz też. –

2

Zastosowanie getch() dostać wejście zamiast korzystania cin, więc wejście nie będzie udostępniana (wiki cytowanie):

int getch (void) Odczytuje znak bezpośrednio z konsoli bez bufora i bez echa.

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

Tutaj jest również another link.

5

Naprawdę pytasz o dwa niezwiązane ze sobą problemy.
Wywołanie cin.tie(NULL) całkowicie oddziela std::cin i . Ale nie wpływa to na nic na niższym poziomie. A na najniższym poziomie, przynajmniej pod Windows i Unix, std::cin i std::cout są podłączone do tego samego urządzenia na poziomie systemu, i to jest to urządzenie (/dev/tty pod Unixem), które robi 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.

Powiązane problemy