Я не могу понять, в чем проблема с моим кодом. Вот мой код:

#include <stdio.h>
#include <stdlib.h>    

#define N 20

typedef struct _dog {
    char dogName[N],ownerName[N];
    int dogAge;
} Dog;

int main() {
    //Dynamic array
    int size;
    printf("Number of dogs: ");
    scanf("%d", &size);
    Dog *dog = (Dog*)malloc(sizeof(Dog)*size);
    printf("\n");
    //Input
    int i;
    printf("Please provide the data: [dogName][ownerName][dogAge] :\n");
    for(i=0;i<size;i++) {
        fgets(dog[i].dogName, sizeof(dog[i].dogName), stdin);
        fgets(dog[i].ownerName, sizeof(dog[i].ownerName), stdin);
        scanf("%d", &dog[i].dogAge);
    }
    //Output
    printf("\nYou provided the following data:\n");
    for(i=0;i<size;i++) {
        printf("Dog Name: %s\nOwner Name: %s\nDog Age: %d\n", dog[i].dogName, dog[i].ownerName, dog[i].dogAge);
    }

    free(dog);
    return 0;
}

Задача довольно проста, вам нужно создать базу данных, но собаки и владельцы могут иметь два или более имен, поэтому я стараюсь использовать fget. Но результат выглядит ужасно: (И первая часть имени собаки обычно пуста)

You provided the following data:
Dog Name: 

Owner Name: Doggy 1

Dog Age: 0
Dog Name: Big Dick

Owner Name: 2

Dog Age: 0

Я прочитал это, но не сделал этого не помогите мне.

Вход, который я использовал:

Doggy 1
Big Dick
2
Doggy 2

Это закончилось после Doggy 2.

6
2b1c 27 Дек 2015 в 17:16

2 ответа

Лучший ответ

Вы покидаете новую строку из вашего последнего scanf(), который является допустимым вводом для fgets(). + Изменить

scanf("%d", &size);

К

scanf("%d%*c", &size);

Для использования и отбрасывания конечной новой строки из-за нажатия клавиши ENTER после ввода количества собак.

То же самое и для сканирования переменных dogAge внутри файла lop.

Связано, цитируя стандарт C11, глава §7.21.6.2, fscanf()

Конечный пробел (включая символы новой строки) остается непрочитанным, если он не соответствует директиве. [...]

Таким образом, newline ('\n'), конечное белое пространство , остается непрочитанным во входном буфере.

11
Sourav Ghosh 22 Дек 2016 в 20:54

Добавьте getchar() после вызовов scanf(...).

Как и в другом упомянутом ответе (ах). scanf использует распознанные символы в соответствии с форматом, но оставляет новую строку \n в stdin. С getchar вы используете его, и последующие чтения из stdin не должны запутаться .

3
Ely 27 Дек 2015 в 14:51