2010-07-02 15 views
5

Desidero creare un programma che imponga all'utente di inserire il testo ma non gli consente di cancellarlo, come è possibile farlo in C?Ignora il tasto backspace dallo stdin

L'unica cosa che ho è (c = getchar()) != EOF && c != '\b' che non funziona. Qualche idea?

risposta

5

POSIX - UNIX versione

#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. Non mi rendo conto che è possibile disabilitare solo alcuni tasti nella modalità cotta. – Dummy00001

+0

Questo è incompleto. Devi anche disabilitare^U o l'utente può ancora cancellare l'intera linea in sospeso. Anche^W. Ci possono essere di più; dai un'occhiata. Un approccio più sicuro disabilita completamente la modalità ICANON. –

+0

R. - sei corretto. Le specifiche OP non includevano questo, IMO. E avresti bisogno di leggere l'intera struttura che termina le possibilità, giusto? Come già detto altrove, una soluzione completa non è quella che ho postato. –

2

Non è possibile farlo con codice portatile, in pratica ogni sistema operativo ha una sorta di buffering/editing minimo incorporato nello stream di input standard.

A seconda dei sistemi operativi che è necessario scegliere come target, c'è un buon cambiamento che sarà disponibile un getch che effettuerà la lettura senza buffer. Su Windows, includi <conio.h> e vai a farlo. Su molti Unix, dovrai includere (e linkare) curses (o ncurses) per questo.

+0

Wrong about curses. Vedi la risposta accettata. È molto facile e portatile (POSIX). –

+0

@R: l'ho guardato. Non sono sicuro che sia ancora abbastanza giusto, e le maledizioni sono decisamente molto più semplici. –

2

Questo è probabilmente più complicato di quanto si immagina. Per fare ciò, presumibilmente avrai bisogno di prendere il controllo dell'eco dei caratteri che l'utente sta digitando, ecc.

Dai un'occhiata alla libreria di curses. La funzione wgetch dovrebbe essere ciò di cui hai bisogno, ma prima dovrai inizializzare le maledizioni, ecc. Avere una lettura delle pagine man - se sei fortunato troverai le pagine man di ncurses o curses-intro. Ecco un frammento:

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); 

Se non hai che manpage/per ulteriori informazioni, cercare le singole pagine man di funzione.

Problemi correlati