Массив символов name
объявляется с 10
элементами
char name[10];
Если вы используете следующий вызов fgets
fgets(dog.name, 10, stdin);
после ввода 10
символов 'a'
, тогда вызов fgets читает только 9
символов из входного буфера и добавляет массив с завершающим нулевым символом '\0'
.
Таким образом, массив будет содержать строку "aaaaaaaaa"
.Это то же самое, что инициализировать массив следующим образом
char name[10[ = { 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', '\0' };
После этого входной буфер будет содержать один символ 'a'
и символ новой строки '\n'
.Эти символы будут прочитаны при следующем вызове
fgets(dog.breed, 10, stdin);
В результате массив bread
будет содержать строку "a\n"
.
Это то же самое, что инициализировать массив следующимway
char bread[10[ = { 'a', '\n', '\0' };
Если вы хотите хранить в массивах строки с большим количеством символов, вы должны увеличить массивы.
Например, если вы хотите ввести для имени массива строку 10
символы 'a'
у вас есть tfo, чтобы объявить массив с 12
элементами.Почему 12
?Поскольку кроме 10
символов 'a'
и завершающего нулевого символа, функция fgets
также попытается прочитать символ новой строки '\n'
из входного буфера.В противном случае этот символ будет прочитан вторым вызовом fgets
.
Чтобы удалить символ новой строки из массива, вы можете использовать следующий подход
#include <string.h>
//...
fgets( dog.name, 12, stdin );
dog.name[strcspn( dog.name, "\n" )] = '\0';