【问题标题】:Passing structures to functions in C programming在 C 编程中将结构传递给函数
【发布时间】:2018-03-14 16:57:24
【问题描述】:

声明的结构:

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);

显示功能:

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);
    //...
}

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

【问题讨论】:

  • 您将希望使用char* 并动态分配而不是固定长度的字符字段。其中一些缓冲区非常短。
  • 您还按值而不是作为指针传递参数,这非常混乱和浪费。
  • 问题是 C 使用按值传递,因此您只需修改原始结构的副本,而不是结构本身。传递地址。
  • 永远不要使用gets。这是一个危险的函数,已从 C 规范中删除。请改用fgets 之类的替代方法。
  • btw..添加..这将只显示一组信息..它不会按说添加新记录..只是一个简单的练习

标签: c struct


【解决方案1】:

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

所以在你的情况下,

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

这样称呼

input(&name, .. );

即使您只想读取这些对象(您不想更改任何内容),那么我也会支持这种做事方式 - 为什么要通过复制那些大型结构实例来增加负担?只需传递他们的地址并使用它。

也不要使用已弃用的gets - 改用fgets,当你使用它时(fgets)不要忘记检查返回值。

【讨论】:

  • 因为监护人结构和学生结构有一个共同的结构,即名称。我认为Name -> fname 从那以后就不会起作用了。生病必须做guard.gname.fname 等。
  • @EricMichaelFadriga.: 嘿,我给你举个例子……我写了name->fname,这是一个变量name。你明白我在说什么吗?
  • 哦哇它成功了!!! :D 谢谢老兄!! :D 我忘了在函数声明中放置*..
【解决方案2】:

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

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

另外,请注意,通过传递结构的值,会复制该值。对于小型结构,这并不重要,但对于“较大”的结构,它会在您的程序速度上付出巨大的代价。

【讨论】:

    猜你喜欢
    • 2015-01-13
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2015-01-03
    相关资源
    最近更新 更多