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で上書きするためです。構造体の最初と最後にメモリを malloc してみてください。

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 に答える