Игнорировать клавишу Backspace от стандартного ввода - PullRequest
5 голосов
/ 02 июля 2010

Я хочу создать программу, которая заставляет пользователя вводить текст, но не позволяет ему стереть что-либо из этого. Какой простой способ сделать это в C?

Единственное, что у меня есть, это (c = getchar()) != EOF && c != '\b', которое не работает. Есть идеи?

Ответы [ 3 ]

5 голосов
/ 02 июля 2010

POSIX - версия 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;        
}
3 голосов
/ 02 июля 2010

Вы не можете сделать это с переносимым кодом - практически каждая ОС имеет своего рода минимальную буферизацию / редактирование, встроенную в стандартный поток ввода.изменить у вас будет getch доступны, что будет читать без буферизации.В Windows вы включаете <conio.h> и идете на это.В большинстве Unix вам нужно включить (и ссылку на) curses (или ncurses) для него.

2 голосов
/ 02 июля 2010

Это, вероятно, сложнее, чем вы думаете. Для этого вам, вероятно, нужно будет контролировать отображение символов, которые печатает пользователь и т. Д.

Взгляните на библиотеку проклятий. Функция wgetch должна быть именно тем, что вам нужно, но сначала вам нужно инициализировать curses и т. Д. Прочтите справочные страницы - если вам повезет, вы найдете ncurses или curses-intro man-страницы. Вот фрагмент кода:

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

Если у вас нет этой справочной страницы / для получения дополнительной информации, посмотрите справочные страницы по отдельным функциям.

...