[英]Struct Array Read Function Changing All Array Values to Most Recent Input - C
其中:ssize是数组的输入大小,student是全局声明的struct,而read_stud是我用来读取数组的函数。
打印时,s [count] .first给我正确的名字,但是s [0]及其后的所有值也都具有相同的名字,而不是先前输入的值。 它正在将结构值更改为我最近的输入!
struct student //this struct is global
{
int number;
char *first ;
char *last ;
};
struct student read_stud (int number, char *first , char *last) //my read_stud function
{
struct student s;
s.number = number;
s.first = first;
s.last = last;
return s;
}
这是在int main
,在这里我使用函数s = calloc(ssize, sizeof (struct student));
for (count = 0; count < ssize ; ++count)
{
printf ("Enter student number, name and last name: \n");
scanf ("%d %s %s", &number, &first, &last);
s[count] = read_stud (number, first, last);
}
最衷心的感谢谁能为我解决这个问题!
您需要为student
结构中的名字和姓氏提供存储。
如果您知道它们的最大长度是多少,请在结构中使用char数组。
#define MAX_NAME_CHARS (20)
struct student //this struct is global
{
int number;
char first[MAX_NAME_CHARS];
char last[MAX_NAME_CHARS];
};
否则,请malloc字符串,并记住以后再释放它们。
struct student read_stud (int number, char *first , char *last) //my read_stud function
{
struct student s;
s.number = number;
s.first = strdup(first);
s.last = strdup(last);
return s;
}
现有代码:
for (count = 0; count < ssize ; ++count)
{
printf ("Enter student number, name and last name: \n");
scanf ("%d %s %s", &number, &first, &last);/*1*/
s[count] = read_stud (number, first, last);
}
struct student read_stud (int number, char *first , char *last) //my read_stud function
{
struct student s;
s.number = number;
s.first = first;/*2*/
s.last = last; /*3*/
return s;
}
因为您分配了相同的值(第一个和最后一个),然后用scanf覆盖。 尝试为结构中的第一个和最后一个分配内存:
struct student read_stud(int number, char *first , char *last) //my read_stud function
{
struct student s;
s.number = number;
s.first = malloc(strlen(first) + 1);
strcpy(first, s.first);
s.last = malloc(strlen(last) + 1); /*3*/
strcpy(last, s.last);
return s;
}
并且不要忘记释放所有分配的内存。 (为简便起见,省略了错误检查。)
struct student *read_stud(int number, char *first , char *last) // my read_stud function
{
struct student *s;
s = malloc(sizeof(struct student));
s->number = number;
s->first = strdup(first);
s->last = strdup(last);
return s;
}
在主要方面:
char first[256], last[256]; /* 256 as example*/
struct student *s = calloc(ssize, sizeof (struct student *));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.