2010-07-02 13 views
5

Quiero hacer un programa que obligue a su usuario a ingresar texto pero no le permite borrar nada de él, ¿cuál es una forma sencilla de hacerlo en C?Ignorar la tecla de retroceso desde stdin

Lo único que tengo es (c = getchar()) != EOF && c != '\b' que no funciona. ¿Algunas ideas?

Respuesta

5

POSIX - UNIX versión

#include <sys/types.h>   
#include <termios.h> 
#include <stdio.h> 
#include <string.h> 

int 
main() 
{ 

     int fd=fileno(stdin); 
     struct termios oldtio,newtio; 
     tcgetattr(fd,&oldtio); /* save current settings */ 
     memcpy(&newtio, &oldtio, sizeof(oldtio)); 
     newtio.c_lflag = ICANON; 
     newtio.c_cc[VERASE] = 0;  /* turn off del */ 
     tcflush(fd, TCIFLUSH); 
     tcsetattr(fd,TCSANOW,&newtio); 
     /* process user input here */ 

     tcsetattr(fd,TCSANOW,&oldtio); /* restore setting */ 
     return 0;   
} 
+0

+1. No me di cuenta de que es posible desactivar solo algunas teclas en el modo cocinado. – Dummy00001

+0

Esto está incompleto. También necesita deshabilitar^U o el usuario puede borrar toda la línea pendiente. También^W. Puede haber más; comprobar. Un enfoque más seguro sería deshabilitar completamente el modo ICANON. –

+0

R. - tienes razón. Las especificaciones OP no incluyen eso, IMO. Y tendrías que leer todo el struct termios desactivando las posibilidades ¿no? Como se mencionó en otra parte, una solución completa no es lo que publiqué. –

2

No se puede hacer con un código portátil; básicamente, todos los SO tienen algún tipo de búfer/edición mínima incorporada en el flujo de entrada estándar.

Dependiendo de los sistemas operativos que necesite para orientar, hay un buen cambio que tendrá un getch disponible que hará la lectura sin bórrete. En Windows, incluye <conio.h> y listo. En la mayoría de Unix, deberás incluir (y vincular) maldiciones (o ncurses) para ello.

+0

Error sobre las maldiciones. Ver la respuesta aceptada. Es muy fácil y portátil (POSIX). –

+0

@R: Lo miré. No estoy seguro de que sea correcto todavía, y maldiciones es definitivamente mucho más fácil. –

2

Esto es probablemente más complicado de lo que imagina. Para hacer esto, presumiblemente necesitará tomar el control del eco de los caracteres que el usuario está escribiendo, etc.

Eche un vistazo a la biblioteca de curses. La función wgetch debe ser lo que necesites, pero primero necesitarás inicializar maldiciones, etc. Lee las páginas man, si tienes suerte, encontrarás ncurses o curses-intro man pages. He aquí un fragmento:

To initialize the routines, the routine initscr or newterm must be 
    called before any of the other routines that deal with windows and 
    screens are used. The routine endwin must be called before exiting. 
    To get character-at-a-time input without echoing (most interactive, 
    screen oriented programs want this), the following sequence should be 
    used: 

     initscr(); cbreak(); noecho(); 

    Most programs would additionally use the sequence: 

     nonl(); 
     intrflush(stdscr, FALSE); 
     keypad(stdscr, TRUE); 

Si no tienes esa página de manual/para más información, busque las páginas del manual de funciones individuales.

Cuestiones relacionadas