Entrada de teclado sin eco ANSI C

He estado buscando en Google sin suerte. Estoy buscando una manera de hacer getc () o get () o lo que sea que no haga eco en el terminal. Vi kbhit () pero esto no parece ser parte de ANSI. Idealmente, me gustaría un código que parezca

char s[100]; no_echo_gets(s); /* Won't echo to screen while being typed */ printf("%s\n", s); 

¿Alguien sabe una buena forma compatible con ANSI para hacer esto?

No puede hacerlo de manera multiplataforma utilizando ANSI C. Tendrá que usar algún código específico del sistema operativo o una biblioteca como ncurses .

Para los sistemas similares a UNIX que desea jugar con la bandera ECHO …

 #include  ... struct termios t; tcgetattr(fd, &t); t.c_lflag &= ~ECHO; tcsetattr(fd, TCSANOW, &t); ... 

El comando getpass está presente en Linux. Pero puede hacer una versión más bonita, el eco del sistema por sí solo no elimina la necesidad de un comando enter, mientras que la eliminación del búfer no anula la producción de un retorno de carraige después de la entrada de datos. Combinar los dos da una buena aproximación de una entrada tranquila. Puedes agregar un asterisco para dar una apariencia de entrada secreta, así que aquí hay una combinación de dos sugerencias:

  #include  #include  #include  int getche(void); int main(int argc, char **argv){ int i=0; char d,c='h',s[6]; printf("Enter five secret letters\n"); s[5]='\0'; //Set string terminator for string five letters long do{ d=getche();//Fake getche command silently digests each character printf("*"); s[i++]=d;} while (i<5); printf("\nThank you!!\n Now enter one more letter.\n"); c=getchar(); printf("You just typed %c,\nbut the last letter of your secret string was %c\n",c,d); printf("Your secret string was: %s\n",s); return 0; } /* reads from keypress, echoes */ int getche(void) { struct termios oldattr, newattr; int ch; tcgetattr( STDIN_FILENO, &oldattr ); newattr = oldattr; newattr.c_lflag &= ~( ICANON | ECHO);\\knock down keybuffer tcsetattr( STDIN_FILENO, TCSANOW, &newattr ); system("stty -echo");\\shell out to kill echo ch = getchar(); system("stty echo"); tcsetattr( STDIN_FILENO, TCSANOW, &oldattr ); return ch; } 

Dado que su tarea es bastante básica, si tiene suerte, su sistema tendrá la función getpass() :

 char * getpass(const char *prompt); 

Si no quieres un aviso, simplemente hazlo:

 char *s = getpass(""); if (s != NULL) printf("Your password was %s!\n", s); 

getpass() , como todas las funciones de C relacionadas con el eco y el almacenamiento en búfer, no es estándar, pero está presente en Mac OS X, probablemente Linux, y aparece en la biblioteca GNU C, por lo que probablemente esté presente en cualquier sistema que use glibc.

Las normas ANSI e ISO, como se indicó anteriormente, no especifican una forma estándar de leer la entrada sin hacer eco, o de leer la entrada sin búfer (es decir, en un carácter a la vez).

Tal vez puedas probar así:

 #include char s[100]; system("stty -echo"); scanf("%s",s); /* Won't echo to screen while being typed */ system("stty echo"); printf("You have entered:"); printf("%s\n", s); return 0; } 

En Linux, la función del sistema “stty -echo” consiste en escribir algo sin eco. Espero que esto ayude.

No hay uno; Ni ANSI C ni ISO C ++ tienen tal cosa.

Esto dependerá de su entorno, no es algo que el lenguaje proporciona. Si pretende realizar E / S en modo de caracteres extensos, puede buscar en una biblioteca como curses. De lo contrario, tendrá que manipular el terminal o la consola de Windows manualmente.

ANSI e ISO C no definen esta funcionalidad, sin embargo, la mayoría de los comstackdores de C tienen getch () o una variación cercana.

Deberá realizar una definición de preprocesador para cada comstackdor que esté utilizando que tenga una biblioteca y función diferentes para esto. No es difícil, aunque podría considerarlo molesto.

-Adán