2011-08-01 12 views
12

Duplicar posible:
Read a password from std::cinOcultar entrada del usuario de solicitud de contraseña

no trabajo normalmente con la consola, por lo que mi pregunta es tal vez muy fácil de contestar o imposible de hacer .

¿Es posible "desacoplar" cin y cout, de modo que lo que escriba en la consola no aparezca directamente en él otra vez?

Necesito esto para dejar que el usuario escriba una contraseña y ni yo ni el usuario normalmente queremos que aparezca su contraseña en plaintext en la pantalla.

Intenté usar std::cin.tie en un stringstream, pero todo lo que escribo todavía está reflejado en la consola.

+0

Véase también: https://github.com/Seldaek/hidden-input – mauris

Respuesta

29

De How to Hide Text:

de 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 

limpieza:

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);' se requiere para la limpieza en Linuz también. –

2

Uso getch() para conseguir la entrada en lugar de utilizar cin, por lo que la entrada no se mostrará (wiki citando):

int getch (void) Lee un carácter directamente desde la consola sin búfer, y sin eco

Esto es realmente C, no C++, pero podría ser adecuado para usted.

Además, aquí está another link.

5

Realmente está preguntando sobre dos problemas no relacionados.
Llamando cin.tie(NULL) desacoplamientos std::cin y std::cout completamente. Pero no afecta nada a un nivel inferior. Y en el nivel más bajo, al menos en Windows y Unix, std::cin y std::cout están ambos conectados al mismo dispositivo en el nivel del sistema, y ​​es ese dispositivo (/dev/tty en Unix) el que hace eco; incluso puede redirigir el estándar a un archivo, y la consola seguirá recibiendo la entrada.

Cómo se desactiva este eco depende del sistema; la solución más fácil es, probablemente, utilizar algún tipo de biblioteca de terceros, como curses o ncurses, que proporcione una interfaz de nivel superior y oculte todas las dependencias del sistema.

Cuestiones relacionadas