Я хочу сделать программу, которая вызывает, это - пользователь для ввода текста, но не позволяет ему стирать какой-либо из него, что такое простой способ сделать его в C?
Единственная вещь, которую я имею, (c = getchar()) != EOF && c != '\b'
который не работает. Какие-либо идеи?
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;
}
Вы не можете сделать это с помощью переносимого кода - по сути, каждая ОС имеет своего рода минимальную буферизацию / редактирование, встроенную в стандартный поток ввода.
В зависимости от целевой операционной системы, есть хорошее изменение: будет доступен getch
, который будет выполнять небуферизованное чтение. В Windows вы включаете
и делаете это. В большинстве Unix вам нужно будет включить curses (или ncurses) (и связать с ними).
Это, вероятно, сложнее, чем вы думаете. Для этого вам, вероятно, потребуется взять на себя управление отображением символов, вводимых пользователем, и т. Д.
Взгляните на библиотеку 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);
Если у вас нет этой справочной страницы / для получения дополнительной информации, поищите отдельные справочные страницы функций.