2010-07-02 16 views
5

Chcę zrobić program, który zmusza użytkownika do wprowadzania tekstu, ale nie pozwala mu na wymazywanie żadnego z nich, jaki jest prosty sposób robienia tego w C?Ignoruj ​​klawisz Backspace z stdin

Jedyne, co mam, to (c = getchar()) != EOF && c != '\b', które nie działa. Jakieś pomysły?

Odpowiedz

5

POSIX - UNIX wersja

#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. Nie zdaję sobie sprawy, że można wyłączyć tylko niektóre klawisze w trybie gotowym. – Dummy00001

+0

To jest niekompletne. Musisz również wyłączyć^U lub użytkownik może nadal usuwać całą oczekującą linię. Również^W. Może być więcej; czek. Bezpieczniejsze podejście całkowicie wyłącza tryb ICANON. –

+0

R. - masz rację. Specyfikacje OP nie uwzględniały tego, IMO. I musiałbyś przeczytać cały blok struktur, wyłączając możliwości? Jak wspomniano w innym miejscu, kompletne rozwiązanie nie jest tym, co napisałem. –

2

Nie można tego zrobić za pomocą przenośnego kodu - zasadniczo każdy system operacyjny ma jakieś minimalne buforowanie/edycję wbudowane w standardowy strumień wejściowy.

W zależności od systemów operacyjnych, na które należy kierować reklamy, istnieje dobra zmiana, że ​​dostępna będzie wersja getch, która będzie wykonywać niebuforowane czytanie. W systemie Windows uwzględnij numer <conio.h> i przejdź do niego. W większości Uniksów musisz dołączyć do niego curses (lub ncurses).

+0

Niepoprawnie na temat przekleństw. Zobacz zaakceptowaną odpowiedź. Jest bardzo łatwy i przenośny (POSIX). –

+0

@R: Spojrzałem na to. Nie jestem pewien, czy to już jest w porządku, a przekleństwa są zdecydowanie łatwiejsze. –

2

Jest to prawdopodobnie bardziej skomplikowana niż można sobie wyobrazić. Aby to zrobić, prawdopodobnie będziesz musiał przejąć kontrolę nad powtarzaniem znaków, które pisze użytkownik itp.

Zobacz bibliotekę klątw. Funkcja wgetch powinna być tym, czego potrzebujesz, ale najpierw musisz zainicjować przekleństwa itp. Przeczytać strony man - jeśli masz szczęście, znajdziesz ncurses lub curses-intro strony man. Oto krótki opis:

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

Jeśli nie masz tej strony podręcznika/w celu uzyskania dalszych informacji, poszukaj poszczególnych stron funkcji.