这是我想要做的。我从用户那里得到3个用户输入(姓名,年龄和性别),所有这些输入都是一条记录。例如,name = John,age = 15,gender = M,这是名为John的人的记录。
我正在尝试制作5条记录,如上例所示,我正在尝试将其存储到数组中。问题是我不知道该怎么做。
这是我到目前为止所做的:
#include<stdio.h>
#include<conio.h>
#define Max 40
struct person{
char name[Max];
int age;
char gender;
};
void inputdetails(struct person *,struct person []);
main()
{
struct person students[5]; //created an array type person to store the records
struct person k;
inputdetails(&k,students); //passed the array in to the input details function
}
void inputdetails(struct person *q,struct person hello[])
{
int i=0;
for(;i<5;i++)
{
printf("Enter name\n");
gets(q->name);
printf("Enter age\n");
scanf("%d",&(q->age));
fflush(stdin);
printf("Enter gender\n");
scanf("%c",&(q->gender));
}
}
我该怎么做?如何将1条记录存储到数组中,所以当我创建一个显示记录的函数时,我只能给出一个索引号,这样它就会显示存储在该索引中的记录?
感谢您的时间。
答案 0 :(得分:2)
将for
循环移至main
,如下所示:
int main() {
struct person students[5]; //created an array type person to store the records
for (int i = 0 ; i != 5 ; i++) {
inputdetails(&students[i], i);
}
return 0;
}
void inputdetails(struct person *q, int pos) {
// Put all the data into q->...
printf("Enter name of student %d\n", pos);
// Do not use gets(), it's a security hazard
scanf("%39s", q->name);
...
}
您当前的实现会创建一个不必要的struct person k
,并在inputdetails
函数内运行循环。假设第二个参数指向大小为5的数组。最后,在循环内部,您不断重新分配同一个临时struct
的元素(指向k
内的main()
,这就是students
未填充的原因
我改变inputdetails
一次只读一个条目。现在main()
负责数据的放置位置:它依次传递指向students[]
的每个元素的指针,以及用于打印目的的学生的序列号。
答案 1 :(得分:0)
您的结构和数组声明是正确的。 (注意:我假设您的输入详细信息与上面显示的dasblinkenlight类似。)
要扫描数组的单个元素(例如,数组的第一个元素),请使用
inputdetails(&students[0], int pos);
要扫描数组的所有元素,请使用
形式的循环for(i=0; i<5; i++)
{
inputdetails(&students[i], i);
}
希望有所帮助。