Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程中向函数传递结构_C_Struct - Fatal编程技术网

C编程中向函数传递结构

C编程中向函数传递结构,c,struct,C,Struct,声明结构: typedef struct{ char fname[25]; char mname[3]; char lname[25]; }Name; typedef struct{ char month[25]; int day,year; }Date; typedef struct{ Name gname; char addr[50]; char cnum[11]; }Guardian; typedef struct

声明结构:

typedef struct{
    char fname[25];
    char mname[3];
    char lname[25];

}Name;

typedef struct{

    char month[25];
    int day,year;

}Date;

typedef struct{
    Name gname;
    char addr[50];
    char cnum[11];
}Guardian;

typedef struct{
    Name sname;
    Date sbday;
    Guardian sguard;
    char gender[6];
    char addr[50];
    char cnum[11];
    char course[10];
    int year;

}Student;
声明的函数:

void input(Name name,Date date, Guardian guard, Student stud);
void display(Name name,Date date, Guardian guard, Student stud);
input(name, date, guard, stud);
display(name, date, guard, stud);
当调用输入函数时,它允许我添加被请求的字符串。然后,调用display函数。它不会显示输入的信息

调用函数:

void input(Name name,Date date, Guardian guard, Student stud);
void display(Name name,Date date, Guardian guard, Student stud);
input(name, date, guard, stud);
display(name, date, guard, stud);
显示功能:

void display(Name name, Date date, Guardian guard, Student stud)
{

    printf("   -=Student Information=-   \n");
    printf("Name: %s %s. %s\n",stud.sname.fname,stud.sname.mname,stud.sname.lname);
    printf("Birtday: %s %d, %d\n",stud.sbday.month,stud.sbday.day,stud.sbday.year);
    printf("Gender: %s\n",stud.gender);
    printf("Contact Number: \n%s",stud.cnum);
    printf("Course & Year: %s-%d \n",stud.course,stud.year);

    printf("   -=Student Guardian Information=-   \n");
    printf("Name: %s %s. %s\n",guard.gname.fname,guard.gname.mname,guard.gname.lname);
    printf("Address: %s\n",guard.addr);
    printf("Contact Number: %s\n",guard.cnum);
}
输入功能:

void input(Name name,Date date, Guardian guard, Student stud)
{

    printf("Student Information \n");
    printf("First Name: ");
    gets(stud.sname.fname);
    //...
}

这将只显示一组信息。它不会每次都添加新记录。这只是一个简单的练习。

就像如何通过函数修改变量的内容一样,您需要给出结构的地址,因为“深层”是一个“int”类型的变量和一个“struct something”类型的变量,它是一个变量

如果你想修改变量的值,你需要发送他的地址(指针)


另外,请注意,通过传递结构的值,将复制该值。对于较小的结构,这并不重要,但对于“较大”的结构,它会对程序的速度造成巨大的损失

就像如何通过函数修改变量的内容一样,您需要给出结构的地址,因为“深层”是一个“int”类型的变量和一个“struct something”类型的变量,它是一个变量

如果你想修改变量的值,你需要发送他的地址(指针)


另外,请注意,通过传递结构的值,将复制该值。对于较小的结构,这并不重要,但对于“较大”的结构,它会对程序的速度造成巨大的损失

C是传递值。因此,当您如图所示传递一个变量时,会将其副本提供给被调用函数,以便它可以使用它。因此,制作副本的对象保持不变。解决方案是传递对象的地址,然后取消引用包含对象地址的复制指针变量,从而更改预期对象

所以在你的情况下

void input(Name *name,Date *date, Guardian *guard, Student *stud){
   printf("%s",name->fname); // short hand for (*name).fname
   ...
}
就像

input(&name, .. );
即使您只想读取这些对象(您不想更改任何内容),那么我也支持这种方式—为什么要复制这些大型结构实例来增加负担?只要把他们的地址传过去,就可以了


另外,不要使用不推荐的
获取
-而是使用
fgets
,使用它时(
fgets
)不要忘记检查返回值

C是传递值。因此,当您如图所示传递一个变量时,会将其副本提供给被调用函数,以便它可以使用它。因此,制作副本的对象保持不变。解决方案是传递对象的地址,然后取消引用包含对象地址的复制指针变量,从而更改预期对象

所以在你的情况下

void input(Name *name,Date *date, Guardian *guard, Student *stud){
   printf("%s",name->fname); // short hand for (*name).fname
   ...
}
就像

input(&name, .. );
即使您只想读取这些对象(您不想更改任何内容),那么我也支持这种方式—为什么要复制这些大型结构实例来增加负担?只要把他们的地址传过去,就可以了


另外,不要使用不推荐的
获取
-而是使用
fgets
,使用它时(
fgets
)不要忘记检查返回值

您需要使用
char*
并动态分配,而不是固定长度的字符字段。这些缓冲区中有些短得可笑。你也在按值传递参数,而不是作为指针,这是非常混乱和浪费的。问题是C使用按值传递,所以你只修改原始结构的副本,而不是结构本身。传递地址。永远不要使用
get
。这是一个危险的函数,已从C规范中删除。使用替代方法,如.btw..来添加。。这将只显示1组信息。。它不会为每个用户添加新记录。。只是一个简单的练习,而不是固定长度的字符字段,您需要使用
char*
并动态分配。这些缓冲区中有些短得可笑。你也在按值传递参数,而不是作为指针,这是非常混乱和浪费的。问题是C使用按值传递,所以你只修改原始结构的副本,而不是结构本身。传递地址。永远不要使用
get
。这是一个危险的函数,已从C规范中删除。使用替代方法,如.btw..来添加。。这将只显示1组信息。。它不会为每个用户添加新记录。。这只是一个简单的练习,因为guardian结构和student结构有一个共同的结构,即Name。。我认为从那时起,
Name->fname
就不起作用了。我必须做
guard.gname.fname
等@EricMichaelFadriga.:嘿,我给你举个例子……我写了
name->fname
这里是一个变量
name
。你明白我说的了吗?哦,哇,真管用!!!:谢谢你,伙计D我忘了在函数声明中放置一个
*
。因为guardian结构和student结构有一个共同的结构,即Name。。我认为从那时起,
Name->fname
就不起作用了。我必须做
guard.gname.fname
等@EricMichaelFadriga.:嘿,我给你举个例子……我写了
name->fname
这里是一个变量
name
。你明白我说的了吗?哦,哇,真管用!!!:谢谢你,伙计D我忘记在函数声明中放置
*
。。