C 将结构传递给函数

C 将结构传递给函数,c,function,structure,C,Function,Structure,所以我在编译这个程序时遇到了一个问题,我就是不能让它工作,我的意思是如果我把inputstudent()代码放在main()中,这会容易得多,但我必须将代码放在函数中,inputstudent()并从main()调用。我知道这听起来很简单,但我搞不懂 #include <stdio.h> #include <stdlib.h> struct student { char surname[50]; int age; char oname[50];

所以我在编译这个程序时遇到了一个问题,我就是不能让它工作,我的意思是如果我把
inputstudent()
代码放在
main()
中,这会容易得多,但我必须将代码放在函数中,
inputstudent()
并从
main()
调用。我知道这听起来很简单,但我搞不懂

#include <stdio.h>
#include <stdlib.h>

struct student
{
    char surname[50];
    int age;
    char oname[50];
    char address[50];
};
void displaystudent();
void inputstudent();

int main(){
    struct student s;
    inputstudent(s);
    displaystudent(s);

    return 0;
}
void inputstudent(struct student s){
    printf("Enter the surname: ");
    scanf("%s",s.surname);
    printf("Enter the other name: ");
    scanf("%s",s.oname);
    printf("Enter the age: ");
    scanf("%d",&s.age);
    printf("Enter the address: ");
    scanf("%s",s.address);    
}
void displaystudent(struct student s)
{
    printf("Surname: %s \n",s.surname);
    printf("Oname: %s \n",s.oname);
    printf("Age: %d \n",s.age);
    printf("Address: %s",s.address);
}
#包括
#包括
结构学生
{
查氏[50];
智力年龄;
char-oname[50];
字符地址[50];
};
无效显示学生();
无效输入学生();
int main(){
结构学生;
输入学生;
学生;;
返回0;
}
无效输入学生(结构学生s){
printf(“输入姓氏:”);
scanf(“%s”,s姓);
printf(“输入其他名称:”);
scanf(“%s”,s.oname);
printf(“输入年龄:”);
scanf(“%d”和s.age);
printf(“输入地址:”);
scanf(“%s”,s.地址);
}
无效显示学生(结构学生s)
{
printf(“姓氏:%s\n”,s.姓氏);
printf(“Oname:%s\n”,s.Oname);
printf(“年龄:%d\n”,s.Age);
printf(“地址:%s”,s地址);
}

您不能将
struct student s
用作
inputstudent()中的参数。这只是一份价值副本。
您应该使用指针作为参数。

作为:


在C语言中,参数是通过值传递的,因此对函数中的参数所做的任何修改都将是局部修改

让我们看一下下面的代码片段,它基本上是您尝试执行的操作的一个非常简单的版本:

void GetNumber(int number)
{
   printf("Type a number:\n");
   scanf("%d", &number);   // modifies the local variable `number`?
}
...
int n = 0;
GetNumber(n);
现在,在调用
GetNumber
之后,
n
的值是多少

这不是用户输入的数字,但仍然是0,这是调用
GetNumber
之前包含的值

您需要的是:

void GetNumber(int *pnumber)
{
   printf("Type a number:\n");
   scanf("%d", pnumber);  // modifies the value pointed by the pointer pnumber
}
...
int n = 0;
GetNumber(&n);  // &n is the memory address of the variable n
你需要阅读C教材中有关指针的章节

其他不太重要的问题

你的原型

void displaystudent();
void inputstudent();

与相应的函数不匹配。

您似乎希望将对结构变量
s
内部
inputstudent()
所做的更改反映回原始变量。在这种情况下,您需要将变量的地址而不是其值传递给函数

如果将
s
的值传递给函数而不是它的地址,则
s
的新副本将在
inputstudent()
中创建,并且在
main()
中的
s
保持不变的情况下,这些值将被读取到此副本中

要解决此问题,请在
main()
中给
inputstudent()
一个指向
s
的指针,并使
inputstudent()
在读取数据时使用此地址。这样,对
inputstudent()
中变量所做的更改将反映回
main()
中的
s

调用如下函数

inputstudent(&s);
要使用指向结构变量的指针访问结构变量的成员,请使用
->
运算符而不是
运算符

void inputstudent(struct student *s){
    printf("Enter the surname: ");
    scanf("%s",s->surname);
    printf("Enter the other name: ");
    scanf("%s",s->oname);
    printf("Enter the age: ");
    scanf("%d",&s->age);
    printf("Enter the address: ");
    scanf("%s",s->address);
}

此外,地址可能包含空格,
scanf()
在其中不起作用。您可以使用
fgets()

正如Michael Walz所提到的,使用指针来修改函数调用中的结构。此外,您的函数签名和定义不匹配,这就是编译器抱怨的原因:

#include <stdio.h>
#include <stdlib.h>

struct student {
    char surname[50];
    int age;
    char oname[50];
    char address[50];
};
void displaystudent(struct student* pStudent);
void inputstudent(struct student* pStudent);

int main() {
    struct student aStudent;
    inputstudent(&aStudent);
    displaystudent(&aStudent);

    return 0;
}
void inputstudent(struct student* pStudent){

    printf("Enter the surname: ");
    scanf("%s", pStudent->surname);
    printf("Enter the other name: ");
    scanf("%s", pStudent->oname);
    printf("Enter the age: ");
    scanf("%d", &pStudent->age);
    printf("Enter the address: ");
    scanf("%s", pStudent->address);

}
void displaystudent(struct student* pStudent)
{
    printf("Surname: %s \n", pStudent->surname);
    printf("Oname: %s \n", pStudent->oname);
    printf("Age: %d \n", pStudent->age);
    printf("Address: %s", pStudent->address);
}
#包括
#包括
结构学生{
查氏[50];
智力年龄;
char-oname[50];
字符地址[50];
};
无效显示学生(结构学生*pStudent);
无效输入学生(结构学生*pStudent);
int main(){
结构学生;
输入学生(和学生);
显示学生(&aStudent);
返回0;
}
无效输入学生(结构学生*pStudent){
printf(“输入姓氏:”);
scanf(“%s”,学生->姓氏);
printf(“输入其他名称:”);
scanf(“%s”,pStudent->oname);
printf(“输入年龄:”);
scanf(“%d”,&p学生->年龄);
printf(“输入地址:”);
scanf(“%s”,pStudent->address);
}
无效显示学生(结构学生*pStudent)
{
printf(“姓氏:%s\n”,学生->姓氏);
printf(“Oname:%s\n”,pStudent->Oname);
printf(“年龄:%d\n”,学生->年龄);
printf(“地址:%s”,pStudent->Address);
}

您正在按值传递结构,这就是函数不修改它的原因。您应该更改用于修改
struct
的函数,将
struct
指针作为参数:

#include <stdio.h>
#include <stdlib.h>


struct student {
    char surname[50];
    int age;
    char oname[50];
    char address[50];
};

void displaystudent(struct student s);
void inputstudent(struct student *s);

int main() {
    struct student s;
    inputstudent(&s);
    displaystudent(s);
    return 0;
}

void inputstudent(struct student *s) {

    printf("Enter the surname: ");
    scanf("%s", s->surname);
    printf("Enter the other name: ");
    scanf("%s", s->oname);
    printf("Enter the age: ");
    scanf("%d", &s->age);
    printf("Enter the address: ");
    scanf("%s", s->address);

}

void displaystudent(struct student s) {
    printf("Surname: %s \n", s.surname);
    printf("Oname: %s \n", s.oname);
    printf("Age: %d \n", s.age);
    printf("Address: %s", s.address);
}
#包括
#包括
结构学生{
查氏[50];
智力年龄;
char-oname[50];
字符地址[50];
};
无效显示学生(结构学生s);
无效输入学生(结构学生*s);
int main(){
结构学生;
输入学生(&s);
学生;;
返回0;
}
无效输入学生(结构学生*s){
printf(“输入姓氏:”);
scanf(“%s”,s->姓氏);
printf(“输入其他名称:”);
scanf(“%s”,s->oname);
printf(“输入年龄:”);
scanf(“%d”,&s->age);
printf(“输入地址:”);
scanf(“%s”,s->address);
}
无效显示学生(结构学生s){
printf(“姓氏:%s\n”,s.姓氏);
printf(“Oname:%s\n”,s.Oname);
printf(“年龄:%d\n”,s.Age);
printf(“地址:%s”,s地址);
}

您的问题基本上有两个原因

  • 函数声明没有任何参数
  • 该结构是通过值传递的,而不是对
    inputsudent
    函数的引用 您可以通过将声明和定义中的函数原型都更改为

    void displaystudent(struct student s);
    void inputstudent(struct student &s);
    

    请正确设置代码格式“无法使其工作”是什么意思?问题是什么?
    void-inputstuden(struct-student-s)
    ->
    void-inputstuden(struct-student*s)
    ,以及
    scanf(“%s”,s.姓氏)->
    scanf(“%s”,s->姓氏)等。您可能希望尝试这种方法
    
    void displaystudent(struct student s);
    void inputstudent(struct student &s);