Игнорировать обратный ключ от stdin

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

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

Версия POSIX – unix

 #include  #include  #include  #include  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; } 

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

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

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

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

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

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