如何在结构中正确使用fgets?

时间:2015-12-27 14:16:44

标签: c scanf fgets

我无法弄清楚我的代码有什么问题。这是我的代码:

#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

我读过this但没有帮助我。

我使用的输入:

Doggy 1
Big Dick
2
Doggy 2

在Doggy 2之后结束。

2 个答案:

答案 0 :(得分:11)

您要离开上一个scanf()的换行符,该换行符是fgets()有效输入。变化

scanf("%d", &size);

scanf("%d%*c", &size);
输入狗的数量后,由于按 ENTER 键,

消耗并丢弃尾随换行符。

同样适用于dogAge变量扫描,也在lop内。

相关,引用C11标准,章节§7.21.6.2,fscanf()

  

除非与a匹配,否则尾部空格(包括换行符)将保持未读状态   指示。 [...]

因此,newline'\n'),尾随空格在输入缓冲区中未被读取。

答案 1 :(得分:3)

rendered来电后添​​加getchar()

与提及的其他答案一样。 scanf(...)根据格式使用已识别的字符,但在scanf中保留换行符\n。使用stdin时,您会使用getchar,而stdin的后续读取不应该混淆