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

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

#include  #include  #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之后结束。

您将离开上一个scanf()的换行符,该换行符是fgets()有效输入。 更改

 scanf("%d", &size); 

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

在输入狗的数量后按ENTER消耗并丢弃尾随换行符。

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

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

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

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

scanf(...)调用之后添加getchar()

与提到的其他答案一样。 scanf根据格式使用识别的字符,但在stdinstdin换行符\n 。 使用getchar你可以使用它,并且后​​续的stdin读取不应该混淆