2010-07-02 5 views
5

Je veux créer un programme qui oblige l'utilisateur à entrer du texte mais ne lui permet pas d'effacer quoi que ce soit, quelle est la manière simple de le faire en C?Ignorer la touche de retour arrière de stdin

La seule chose que j'ai est (c = getchar()) != EOF && c != '\b' qui ne fonctionne pas. Des idées?

Répondre

5

Posix - Version unix

#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. Je n'ai pas réalisé qu'il est possible de désactiver seulement certaines touches dans le mode cuit. – Dummy00001

+0

Ceci est incomplet. Vous devez également désactiver^U ou l'utilisateur peut toujours effacer toute la ligne en attente. Aussi^W. Il peut y avoir plus; vérifier. Une approche plus sûre désactiverait complètement le mode ICANON. –

+0

R. - vous avez raison. Les spécifications OP ne comprennent pas cela, IMO. Et vous auriez besoin de lire à travers l'ensemble struct termios désactiver les possibilités non? Comme mentionné ailleurs, une solution complète n'est pas ce que j'ai posté. –

2

Vous ne pouvez pas le faire avec du code portable - essentiellement chaque système d'exploitation a une sorte de mise en mémoire tampon minimale/édition intégrée dans le flux d'entrée standard.

Selon les systèmes d'exploitation que vous devez cibler, il y a un bon changement qui vous donnera un getch disponible qui fera une lecture sans tampon. Sur Windows, vous incluez <conio.h> et allez-y. Sur la plupart des Unix, vous devrez inclure (et lier à) des curses (ou ncurses) pour cela.

+0

Mauvais propos de malédictions. Voir la réponse acceptée. C'est très facile et portable (POSIX). –

+0

@R: Je l'ai regardé. Je ne suis pas sûr que ce soit encore juste, et les sorts sont nettement plus faciles. –

2

Ceci est probablement plus compliqué que vous imaginez. Pour ce faire, vous devrez probablement prendre en charge le contrôle de l'écho des caractères que l'utilisateur saisit, etc.

Jetez un coup d'œil à la bibliothèque de curses. La fonction wgetch devrait être ce dont vous avez besoin, mais vous devrez d'abord initialiser les sorts, etc. Lisez les pages de manuel - si vous êtes chanceux, vous trouverez les pages de manuel ncurses ou curses-intro. Voici un extrait:

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 vous ne l'avez pas obtenu cette page de manuel/pour plus d'info, regardez les pages de manuel de fonction individuelles.

Questions connexes