如何在结构中正确使用 fgets?
How to use fgets properly in a structure?
我不知道我的代码有什么问题。这是我的代码:
#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
狗狗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. [...]
因此,newline
('\n'
),尾随白色 space,在输入缓冲区中未被读取。
在 scanf(...)
调用之后添加一个 getchar()
。
与提到的其他答案一样。 scanf
根据格式消耗识别的字符,但在stdin
中留下换行符\n
。使用 getchar
您可以使用它,随后从 stdin
读取的内容不应 混淆 。
我不知道我的代码有什么问题。这是我的代码:
#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
狗狗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. [...]
因此,newline
('\n'
),尾随白色 space,在输入缓冲区中未被读取。
在 scanf(...)
调用之后添加一个 getchar()
。
与提到的其他答案一样。 scanf
根据格式消耗识别的字符,但在stdin
中留下换行符\n
。使用 getchar
您可以使用它,随后从 stdin
读取的内容不应 混淆 。