1

其中:ssize 是数组的输入大小,student 是全局声明的结构,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); 
}

非常感谢能帮我解决这个问题的人!

4

3 回答 3

4

您需要为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;
}
于 2012-10-30T14:58:00.757 回答
1

现有代码:

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;
    }

并且不要忘记释放所有分配的内存。(为简洁起见,省略了错误检查。)

于 2012-10-30T14:59:52.423 回答
0
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 *));
于 2012-10-30T14:53:29.827 回答