繁体   English   中英

结构数组读取功能将所有数组值更改为最新输入-C

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM