如何将结构数组的每个元素传递给函数?

时间:2018-08-19 08:17:47

标签: c

我试图创建一个具有结构数组的简单c程序,并将该数组的每个元素传递给一个函数,然后尝试在下面的代码中显示它。

#include<stdio.h>
#include<string.h>

struct students{
    char name[50];
    int marks;
}st[10];


int size;

int addStudent(struct students st,char sname[], int marks){
    static int count = 0;
    strncpy(st.name,sname,strlen(sname));
    st.marks = marks;
    count++;
    return count;
}

void showStudents(int size){
    int i;
    printf("Total number of students : %d\n",size);
    for(i=0;i<size;i++){
        printf("Student Name : %s\nMarks : %d\n",st[i].name,st[i].marks);
    }   
}

int main(){
    int n, marks, i;
    char name[50];
    printf("Enter the total number of students : ");
    scanf("%d",&n);
    getchar();
    for(i=0;i<n;i++){
        printf("Enter the name of the Student : ");
        fgets(name,50,stdin);
        printf("Enter the marks of the student : ");
        scanf("%d",&marks);
        getchar();
        size = addStudent(st[i], name, marks);
    }

    showStudents(size);

    return 0;
}

我得到以下输出

Enter the total number of students : 2
Enter the name of the Student : shibli
Enter the marks of the student : 23
Enter the name of the Student : max
Enter the marks of the student : 45
Total number of students : 2
Student Name :
Marks : 0
Student Name :
Marks : 0

没有得到任何价值的名称和标记,没有人可以帮助我解决我的代码错误。

1 个答案:

答案 0 :(得分:3)

将结构传递给函数时,函数实际上将结构复制到输入的struct参数并对其进行处理。因此,addStudent函数不适用于您的全局数组项目,但不适用于本地副本。

您应该将指向结构项的指针传递给函数并进行处理。代码如下:

int addStudent(struct students *st,char sname[], int marks){
    static int count = 0;
    strncpy(st->name,sname,strlen(sname)+1);
    st->marks = marks;
    count++;
    return count;
}

和对addStudent函数的调用如下:

    size = addStudent(&st[i], name, marks);

通常,代码可以进行其他改进,例如不使用全局变量和静态计数器,但这不在您的问题范围之内。

这里还有另一个问题,使用strncpy复制字符串的strlen,不会以null结尾字符串。因此,您应该使用strlen + 1复制空终止符,或者简单地使用snprintf在字符串末尾添加空终止符