我无法弄清楚我的代码有什么问题。这是我的代码:
#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》之后就结束了。
最佳答案
您将从最后一个 scanf()
中留下一个换行符,这是 fgets()
的有效输入。改变
scanf("%d", &size);
至
scanf("%d%*c", &size);
由于输入狗的数量后按ENTER键而消耗并丢弃尾随换行符。
同样的情况也适用于 lop 内部的 dogAge
变量扫描。
相关,引用C11
标准,第§7.21.6.2章,fscanf()
Trailing white space (including new-line characters) is left unread unless matched by a directive. [...]
因此,换行符
('\n'
)、尾随空白在输入缓冲区中保持未读状态。
关于c - 如何在结构中正确使用 fgets?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37238471/