C-通过引用和值将结构参数传递给函数

C-通过引用和值将结构参数传递给函数,c,function,reference,structure,C,Function,Reference,Structure,我可以解释一下我做错了什么。这个程序是用来输入和显示学生的详细信息的。它必须使用一个结构并具有2个功能;一个用于捕获(通过引用传递),另一个用于显示(通过值传递) 这是我的密码: #include <stdio.h> struct Students{ int ID; char name[50]; int age; char address[100]; char course[30]; } aStudent[5]; void capture(

我可以解释一下我做错了什么。这个程序是用来输入和显示学生的详细信息的。它必须使用一个结构并具有2个功能;一个用于捕获(通过引用传递),另一个用于显示(通过值传递)

这是我的密码:

#include <stdio.h>

struct Students{
    int ID;
    char name[50];
    int age;
    char address[100];
    char course[30];
} aStudent[5];

void capture(char *name , int *age , char *address, char *course){
        int i;

        for(i=0; i<5; i++){
        aStudent[i].ID = i+1;

        printf("\nFor Student number %d:\n",aStudent[i].ID);

        printf("Enter Student Name: ");
        scanf ("%s", &aStudent[i].name);

        printf("Enter Student Age: ");
        scanf ("%d", &aStudent[i].age);

        printf("Enter Student Address: ");
        scanf ("%s", &aStudent[i].address);

        printf("Enter Course: ");
        scanf ("%s", &aStudent[i].course);
    }
}

void display(char name, int age , char address, char course){
    int i;

        for(i=0; i<5; i++){
          printf("\nStudent %d:\n",aStudent[i].ID);
           printf("Name: %s\t\tAge: %d\t\tAddress: %s\t\tCourse: 
 %s",aStudent[i].name, aStudent[i].age, aStudent[i].address, 
aStudent[i].course);

        printf("\n");
    }
}

void main()
{
    int option, age;
    char  name, address, course;

    printf("\t...Welcome to the Student Data System...\n\n");

    printf("\nPlease Select An Option: \n1. Input Student Data\n2. View 
   Student Data\n3. Exit Syatem\n\n");
    scanf("%d",&option);


    switch(option){
        case 1:
            printf("Enter Student Details:\n");
             capture(name, age , address, course);
            break;
        case 2:
            printf("\nDisplaying Information:\n");
            display(name, age , address, course);
            break;
        case 3:
            close();
            break;
        default:
            printf("\nSorry, your option is not valid.");
    } 

}
#包括
结构学生{
int-ID;
字符名[50];
智力年龄;
字符地址[100];
炭层[30];
}学生[5];
无效捕获(字符*名称、整数*年龄、字符*地址、字符*课程){
int i;

对于(i=0;i您没有初始化字符串,而是初始化了一个字符!
char name,address,course;
如果您使用了'char*name,*address,*course;'或
char name[100],address[100],course[100];
您可能已经得到了答案!如果使用上述情况,您应该使用
scanf(“%s”,name)进行扫描;
!希望我回答了您的问题!

首先,当您调用这两个函数时,您尝试传递的变量(通过值或引用传递)capture()和display(),没有在任何地方使用,因为在捕获或显示结果时,您直接与结构学生的成员打交道

出现语法错误的原因是因为capture()需要变量的地址(&name,&age,&address,&course),并且您正在传递变量(name,age,address,course)。另外,您正在使用,

scanf ("%s", &aStudent[i].name);
而不是

scanf ("%s", aStudent[i].name);
在我看来,与其使结构数组全局化,不如在main函数中声明它,并将整个结构数组作为引用传递给capture(),然后将其按值传递给display(),这样更符合您的目标,因为您需要在代码中同时使用按值调用和引用

我对您的代码进行了一些编辑,并添加了返回主菜单选项。这对我来说很有效,如果我的答案冗长且难以理解,我深表歉意,因为这是我在stackoverflow中的第一个答案。谢谢

#include <stdio.h>

struct Students
{
    int ID;
    char name[50];
    int age;
    char address[100];
    char course[30];
};

void capture(struct Students *aStudent)
{
    int i;

    for(i=0; i<2; i++)
    {
        aStudent[i].ID = i+1;

        printf("\nFor Student number %d:\n",aStudent[i].ID);

        printf("Enter Student Name: ");
        scanf ("%s", aStudent[i].name);

        printf("Enter Student Age: ");
        scanf ("%d", &aStudent[i].age);

        printf("Enter Student Address: ");
        scanf ("%s", aStudent[i].address);

        printf("Enter Course: ");
        scanf ("%s", aStudent[i].course);
    }
}

void display(struct Students aStudent[])
{
    int i;

    for(i=0; i<2; i++)
    {
        printf("\nStudent %d:\n",aStudent[i].ID);
        printf("Name: %s\t\tAge: %d\t\tAddress: %s\t\tCourse: %s",aStudent[i].name, aStudent[i].age, aStudent[i].address,aStudent[i].course);

        printf("\n");
    }
}

void main()
{
    struct Students aStudent[2];
    int option;
    char choice = 'Y';

    printf("\t...Welcome to the Student Data System...\n\n");

    while(choice == 'Y' || choice == 'y')
    {
        printf("\nPlease Select An Option: \n1. Input Student Data\n2. View Student Data\n3. Exit Syatem\n\n");
        scanf("%d",&option);
        switch(option)
        {
        case 1:
            printf("Enter Student Details:\n");
            capture(aStudent);
            printf("Return to main menu? (Y/N) :");
            scanf(" %c",&choice);
            break;
        case 2:
            printf("\nDisplaying Information:\n");
            display(aStudent);
            printf("Return to main menu? (Y/N) :");
            scanf(" %c",&choice);
            break;
        case 3:
            close();
            break;
        default:
            printf("\nSorry, your option is not valid.");
        }

    }

}
#包括
结构学生
{
int-ID;
字符名[50];
智力年龄;
字符地址[100];
炭层[30];
};
无效捕获(结构学生*aStudent)
{
int i;

对于(i=0;如果您的最后一个问题,您可以创建一个循环(例如,
while(true){…}
),在其中读取用户的输入。当您不使用参数时,为什么要将参数传递给
显示
捕获
?还有什么是
关闭
?并且没有“按引用传递”在C中,所有参数都是按值传递的。不需要将参数传递给程序中的函数。C不支持按引用传递,但严格按值传递。指针不是引用!对不起,我指的是调用,不是pass,但我不太明白您在这里的意思“在我看来,与其使结构数组全局化,不如在主函数中声明它,并将整个结构数组作为引用传递给capture(),然后将其按值传递给display(),这样对您的目标更好,因为您需要在代码中同时使用按值调用和引用“无需道歉,通过在全局范围内声明aStudent[5],您的函数capture()和display()都可以访问数组中的数据,而无需通过值调用或引用传递参数。您说过要通过值调用将数据传递给capture(),通过值调用将数据传递给display()。因此最好声明aStudent[5]在main函数内部,通过参数将其传递给函数,就像我在上面的代码中所做的那样。