2012-02-15 9 views
9

Estoy escribiendo un programa en C++ donde se supone que debo recibir una cadena del usuario sin mostrarla en la pantalla (por ejemplo: una contraseña). Intenté usar cin y gets para aceptar la cadena. Pero ambos harán eco de los caracteres ingresados ​​por el usuario en la consola.Entrada de cadena no sincronizada en C++

Entonces, ¿hay alguna función u otra forma de hacerlo en C++?

+0

y ¡Hola al comienzo de la publicación se elimina automáticamente! – ZoomIn

+0

Sí, y eso es algo bueno: tratamos de mantener las preguntas (y respuestas) al punto aquí. No usar "Hola" y "gracias" * no * se considera descortés en Stack Overflow. De todos modos, tenga un voto positivo, buena pregunta. –

+1

echa un vistazo a * NCurses * (unix) y * PDCurses * (windows). –

Respuesta

3

Cómo evitar que los datos que se leen a través de cin aparezca en la consola depende mucho de la consola; Ciertamente depende del sistema operativo.

En Windows, puede usar la función SetConsoleMode para habilitar/deshabilitar el eco para cualquier identificador de archivo, incluido el identificador de entrada estándar.

Algo así como

void enableStdinEcho(bool b) { 
    HANDLE hStdin = ::GetStdHandle(STD_INPUT_HANDLE); 
    DWORD mode = 0; 
    ::GetConsoleMode(hStdin, &mode); 
    if (b) { 
     mode |= ENABLE_ECHO_INPUT; 
    } else { 
     mode &= ~ENABLE_ECHO_INPUT; 
    } 
    ::SetConsoleMode(hStdin, mode); 
} 

probablemente podría ser utilizado para cambiar el eco de la entrada estándar.

+0

¡En el sistema de Windows funcionaba como un amuleto! Ahora probaba getpass con gcc-linux. – ZoomIn

+1

void enableStdinEcho (bool b) { \t int ttyDevice = STDOUT_FILENO; struct termios termAttributes; /* Asegúrese de que el descriptor de archivo sea para un dispositivo TTY. */ if (! Isatty (ttyDevice)) { exit (1); \t} else { \t si (tcgetattr (ttyDevice, y termAttributes)! = 0) { \t \t \t \t de salida (1); \t \t \t} else { \t \t \t \t si (b == false) \t \t \t \t \t termAttributes.c_lflag & = ~ ECHO; \t \t \t \t demás \t \t \t \t \t termAttributes.c_lflag | = ECHO; \t \t \t \t \t \t \t \t tcsetattr (ttyDevice, TCSANOW, y termAttributes); \t \t \t}} \t } equivalente en UNIX based.Got/Linux este material de trabajo. – ZoomIn

3

El estándar C++ no define un mecanismo para hacer esto. Debe confiar en una biblioteca específica de la plataforma. Por ejemplo con el uso gcc/glibc getpass

http://www.gnu.org/software/libc/manual/html_mono/libc.html#getpass

Puede haber otras bibliotecas que estas funciones abstractas y proporcionar una envoltura independiente de la plataforma.

+0

No es necesario contar con una biblioteca completa, 'tcsetattr' suele ser suficiente para los equipos. La página de manual para glibc 'getpass' incluso dice:" Esta función está obsoleta. No la use ". – PlasmaHH

+0

Sí tcsetattr bastaría para gcc. – ZoomIn

2

No se trata de una pregunta de C++, iostream, etc., es específica del terminal que está utilizando.

Consulte this question para obtener ideas, y luego haga una pregunta específica a su terminal si no está cubierta allí y no puede usar ncurses.

Cuestiones relacionadas