2010-04-14 18 views
10

Soy consciente de que no es posible repetir el * mientras escribe en el estándar ANSI C. Pero ¿hay alguna manera de mostrar nada mientras alguien está escribiendo su contraseña en la consola? Lo que quiero decir es como las instrucciones sudo en una terminal Unix/Linux. Me gusta si escribe el comando: sudo cp /etc/somefile ~/somedir. Por lo general, se le solicita la contraseña de root. Y mientras lo ingresa, el terminal no muestra nada. ¿Este efecto es posible en C? Si es así, ¿cómo?Ingrese la contraseña en C

+0

¿Qué no se puede mostrar "*"? printf ("*"); lo haré. –

+0

@ Peter K .: Creo que se está refiriendo al hecho de que todas las funciones de entrada estándar se hacen eco en la consola. Claro, puede imprimir *, pero el personaje que el usuario escribió ya está allí. –

+0

posible duplicar http://stackoverflow.com/questions/1196418/getting-a-password-inc-c-without-using-getpass-3 –

Respuesta

8

La función que está buscando es: getpass(). Notará, sin embargo, que está marcado como "LEGADO". Aunque no va a ir a ninguna parte, la función no permite especificar el tamaño del búfer de entrada, lo que hace que no sea una interfaz muy buena. Como ha observado Jefromi, el manual de glibc proporciona portable example code for implementing getpass from scratch de una manera que permite un tamaño de entrada arbitrario (y no es LEGADO).

+0

Deberían proporcionar un 'getnpass()' para que no todos los programadores necesiten reinventar la rueda ... – Calmarius

0

* Esta no es la norma ANSI C (Gracias Billy) muestra

Puede detectar activación de las teclas _kbhit(), a continuación, obtener el valor con _getch(). Ambas funciones no reflejarán el contenido en la pantalla.

#include <conio.h>   //For keyboard events 
#include <stdio.h>   //Include this or iostream 
#include <locale>   
int main() 
{ 
    bool bContinue = true; 
    char szBuffer[255] = {0}; 
    unsigned int nbufIndex = 0; 
    while (bContinue) 
    { 
     if (_kbhit()) 
     { 
      szBuffer[nbufIndex] = _getch(); 
      if (szBuffer[nbufIndex] == 0xD) 
      { 
       bContinue = false; 
      } 
      else 
      { 
       ++nbufIndex; 
       printf("*"); 
      } 
     } 
    } 
    printf("\n%s\n", szBuffer); 
    return 0; 
} 
+0

Tenga en cuenta que esto no es ANSI C. –

+1

No creo que 'conio.h' probablemente esté disponible si usted ' volver a compilar en UNIX o Linux. –

0

método del hombre pobre de hacer esto es leer caracteres de entrada de usuario por carácter, y después de recibir cada carácter, imprima un carácter de retroceso seguido de *. La salida se envía técnicamente a la consola, pero se borra inmediatamente y se sobrescribe con un asterisco (a menudo incluso antes de que ese cuadro se dibuje en la pantalla). Tenga en cuenta que esto no es realmente un método seguro y tiene varios agujeros de seguridad, pero para aplicaciones de baja seguridad de baja tecnología, funciona.

Cuestiones relacionadas