Следующий код работает, но если я ввожу более 10 символов (скажем, 10 а), вывод превращается в нечто подобное:
"Кличка собаки? ааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааааа за собачья порода? ааааааааааааааааааааааа за порода собаки:"
Почему это? И как я могу это исправить?
#include <stdio.h>
#include <stdlib.h>
typedef struct Dog {
char name[10];
char breed[10];
} Dog;
Dog makeDog() {
Dog dog;
printf("Dog's name? ");
fgets(dog.name, 10, stdin);
printf("Dog's breed? ");
fgets(dog.breed, 10, stdin);
return dog;
}
int main() {
printf("\n");
Dog dog = makeDog();
printf("\n");
printf("Dog's name: %s", dog.name);
printf("Dog's breed: %s \n", dog.breed);
}
fgets()
сохраняет последнюю новую строку. Если его нет во входных данных, входные данные были усечены, а остальная часть все еще находится во входном буфере (если только это не последняя строка файла и в ней отсутствует новая строка). Кстати, в обычном случае вам нужно будет удалить эту новую строку. Чтобы исправить это, используйте массив большего размера, или динамически выделяйте память, или выйдите из программы, потому что она не может хранить введенные вами данные. - person Weather Vane   schedule 18.06.2019fgets()
будет введено только максимум (в данном случае) 9 символов, а 10-я позиция в массиве будет установлена на'\0'
Таким образом, вstdin
все еще есть символы «a». - person user3629249   schedule 18.06.2019makeDog()
относительно:Dog dog;
иreturn dog;
Так как стойка "Собака" находится в стеке и "выйдет за пределы" при выходе из функции. Доступ к нему в вызывающей функции является неопределенным поведением - person user3629249   schedule 18.06.2019int f; f = 5; return f;
. - person William Pursell   schedule 18.06.2019int ch; while( (ch = getchar()) != EOF && ch != '\n' ){;}
- person user3629249   schedule 18.06.2019struct dog
, возникнут проблемы. Вот почему я предлагаю в своем ответе использовать динамическое выделение памяти и возвращать указатель на эту динамическую память. - person user3629249   schedule 18.06.2019fgets()
. Все функции библиотеки C полностью описаны на страницах MAN. Если на вашем компьютере нет страниц MAN, выполните поиск по синтаксису ‹functionName› в c - person user3629249   schedule 20.06.2019