2010-07-02 9 views
5

Ich möchte ein Programm erstellen, das den Benutzer zur Eingabe von Text zwingt, aber nicht erlaubt, etwas davon zu löschen. Was ist eine einfache Methode, dies in C zu tun? Das einzige, was ich habe, ist (c = getchar()) != EOF && c != '\b', die nicht funktioniert. Irgendwelche Ideen?Ignorieren der Rücktaste von der Standardeingabe

Antwort

5

POSIX - Unix-Version

#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. Ich bin mir nicht bewusst, dass es im gekochten Modus möglich ist, nur einige Tasten zu deaktivieren. – Dummy00001

+0

Dies ist unvollständig. Sie müssen auch^U deaktivieren oder der Benutzer kann immer noch die gesamte ausstehende Zeile löschen. Auch^W. Es kann mehr geben; prüfen. Eine sicherere Vorgehensweise wäre die vollständige Deaktivierung des ICANON-Modus. –

+0

R. - Sie haben Recht. Die OP-Spezifikationen enthielten das nicht, IMO. Und Sie müssten die gesamten struct termios abschalten Möglichkeiten richtig lesen? Wie an anderer Stelle erwähnt, ist eine vollständige Lösung nicht das, was ich gepostet habe. –

2

Sie können es nicht mit portierbarem Code machen - im Grunde hat jedes Betriebssystem eine Art von minimaler Pufferung/Bearbeitung, die in den Standard-Eingabestrom eingebaut ist.

Abhängig von den Betriebssystemen, auf die Sie zielen müssen, gibt es eine gute Änderung. Sie haben eine getch zur Verfügung, die ungepuffert lesen wird. Unter Windows fügen Sie <conio.h> hinzu und gehen Sie dafür. In den meisten Unix-Umgebungen müssen Sie curses (oder ncurses) dafür angeben (und darauf verlinken).

+0

Falsch über Flüche. Siehe die akzeptierte Antwort. Es ist sehr einfach und portabel (POSIX). –

+0

@R: Ich habe es angeschaut. Ich bin mir nicht sicher, ob es schon richtig ist und Flüche sind definitiv viel einfacher. –

2

Dies ist wahrscheinlich komplizierter als Sie sich vorstellen. Um dies zu tun, müssen Sie vermutlich die Kontrolle über das Echo der Zeichen übernehmen, die der Benutzer eingibt etc.

Werfen Sie einen Blick auf die Curses-Bibliothek. Die wgetch-Funktion sollte das sein, was Sie brauchen, aber zuerst müssen Sie Flüche usw. initialisieren. Lesen Sie die man-Seiten - wenn Sie Glück haben, werden Sie ncurses oder curses-intro man-Seiten finden. Hier ist ein Ausschnitt:

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

Wenn Sie nicht haben, dass manpage/für weitere Informationen, die einzelnen Funktions Mann Seiten nachschlagen.

Verwandte Themen