我试图创建一个具有结构数组的简单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
没有得到任何价值的名称和标记,没有人可以帮助我解决我的代码错误。
答案 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在字符串末尾添加空终止符