Учитывая определение fgets()
:
char *fgets( char *str, int count, FILE *stream );
(до C99)
char *fgets( char *restrict str, int count, FILE *restrict stream );
(начиная с C99)
Читает не более count - 1
символов из указанного файлового потока и сохраняет их в символе array
, указанном str
. Разбор прекращается, если обнаружен символ newline
, в этом случае str
будет содержать этот символ newline
или если произойдет end-of-file
. Если считываются байты и ошибок не возникает, записывает null character
в позиции сразу после последнего записанного символа в str
.
Поведение не определено, если count
меньше 1. Это также не указано, записан ли символ null
, если count==1
.
fgets
сохраняет введенную строку с максимальной длиной (размером) 5 в переменной str
и завершает ее нулем.
Поскольку указанный вами размер равен 5, если вы введете "Hello"
, он сохранит H e l l \0
, заменив 'o'
, 'o'
не будет сохранен, и, как правило, 'o'
и '\n'
останутся в буфере stdin
, хотя это не является обязательным для стандартных требований.
Если вы введете "Hell"
, буфер stdin
будет иметь H e l l \n
, поэтому при сохранении '\n'
будет заменен на '\0'
, а '\n'
останется в буфере.
Таким же образом, если строка меньше 5 - 1
, ничего не заменяется, char array
обнуляется, т. Е. "Hel"
будет сохранен как H e l \n \0
, а буфер stdin
будет очищен.
Вот почему вы обычно объявляете ваш char array
1 символ больше, чем фактический максимальный ожидаемый размер, и передаете его размер fgets
:
fgets(str, sizeof(str), stdin);
Обратите внимание, что вы не следует использовать fflu sh (stdin) .