Проигнорируйте клавишу Backspace от stdin

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

Единственная вещь, которую я имею, (c = getchar()) != EOF && c != '\b' который не работает. Какие-либо идеи?

5
задан Iceland_jack 2 July 2010 в 17:09
поделиться

3 ответа

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;        
}
5
ответ дан 13 December 2019 в 22:01
поделиться

Вы не можете сделать это с помощью переносимого кода - по сути, каждая ОС имеет своего рода минимальную буферизацию / редактирование, встроенную в стандартный поток ввода.

В зависимости от целевой операционной системы, есть хорошее изменение: будет доступен getch , который будет выполнять небуферизованное чтение. В Windows вы включаете и делаете это. В большинстве Unix вам нужно будет включить curses (или ncurses) (и связать с ними).

3
ответ дан 13 December 2019 в 22:01
поделиться

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

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

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

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

2
ответ дан 13 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: