Когда fgets
читает строку, произойдет то, что он будет читать символы из указанного потока, пока не встретит '\n'
или EOF
, пока не будет прочитан указанный максимальный размер для чтения или ошибка чтения. происходит. Он вообще не видит, что вы делаете на клавиатуре. Он видит только поток, но это терминал, который отправляет данные в поток.
То, что происходит при редактировании ввода, не имеет абсолютно никакого отношения к fgets
. Это работа с терминалами.
Как писал в комментариях Эрик Постпищил:
Нажатие control-D в Linux не сигнализирует EOF. На самом деле это означает «завершить текущую операцию чтения». В этот момент, если символы были введены, они немедленно отправляются в программу, тогда как система обычно будет ждать, пока не будет нажата Enter. Если никакие символы не были введены, операция чтения завершается с нулевым чтением символов, которое некоторые процедуры ввода / вывода рассматривают как EOF, и именно поэтому программы могут казаться, что получают EOF, когда нажатие клавиши control-D в начале строки ввода. Поскольку данные отправляются в программу, отменить их, конечно, невозможно - они уже отправлены.
Я думаю, что есть какой-то способ изменить поведение нажатия C-d, но тогда вам нужно решить, что он должен делать вместо этого. Если вы хотите, чтобы он ничего не делал вместо отправки данных на stdin
, я не вижу, что вы выиграли. Единственный вариант использования, который я вижу, это то, что у вас по какой-то причине возникают проблемы с случайным нажатием клавиши C-d время от времени.
Одна вещь, которую вы могли бы сделать, это получить полный контроль над каждым нажатием клавиши. Затем вам придется писать код для перемещения курсора каждый раз, когда пользователь нажимает клавишу, а также писать код для удаления символов, когда пользователь нажимает клавишу Backspace. Для этого вы можете использовать библиотеку типа ncurses
.