C - 无法在while循环之外打印结构

时间:2016-03-26 11:17:54

标签: c list memory-management struct io

我正在制作的程序使用io重定向逐行读取文件,每行都是列表中的记录。我需要打印一个结构列表,但除非是在while循环中,否则我无法打印。它以前使用for循环(i = 0,i(lessthan)list.nused; i ++),但是当我这样做时,没有任何打印,也没有错误。任何帮助都会很棒,谢谢。以下是代码的一部分:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define NAMESIZE 20
#define BLOCK    2
#define BUFSIZE  512

typedef struct {
    char last[NAMESIZE];
    char first[NAMESIZE];
} name;
typedef struct {
    name name;
    int score;
} record;
typedef struct {
    record **data;
    size_t nalloc;
    size_t nused;
} record_list; 
void list_init(record_list *list) {
    list->data = NULL;
    list->nalloc = list->nused = 0;
}
int make_list (record_list *list) {
    int score;
    size_t i;
    char line[BUFSIZE];
    char fname[NAMESIZE];
    char lname[NAMESIZE];
    while (fgets(line, BUFSIZE, stdin) != NULL) {
        if (list->nalloc == list->nused) {
            record *rec = realloc(list->data, (list->nalloc+BLOCK)*sizeof(record));
            if (rec == 0) {
                fprintf(stderr, "Unable to resize.");
                clearerr(stderr);
                return 1;
            }
            list->data = &rec;
            list->nalloc += BLOCK;
        }
        if (fgets(line, BUFSIZE, stdin) == NULL) {
            clearerr(stdin);
            return 1;
        }
        sscanf(line, "%s %s %d", fname, lname, &score);
        strcpy(list->data[list->nused]->name.first, fname);
        strcpy(list->data[list->nused]->name.last, lname);
        list->data[list->nused]->score = score;
        list->nused = list->nused++;
        //here is where it is able to print
        //printf("%s\n", list->data[list->nused]->name.last);
    }
    //I would like it to print everything here
    for (i = 0; i < list->nused; i++) {
        printf("%s, %s: %d\n", list->data[i]->name.last,
        list->data[i]->name.first, list->data[i]->score);
    }
    return 1;
}
int main(int argc, char *argv[]) {
    record_list list;
    list_init(&list);
    make_list(&list);
}

1 个答案:

答案 0 :(得分:2)

你犯了一些小错误。首先,将record_list的定义更改为:

typedef struct {
    record *data;
    size_t nalloc;
    size_t nused;
} record_list;

您正在调整一个内存块,该内存块将包含许多record个对象,因此您应该有一个指向记录的指针而不是指向指针的指针 - 如果您想要管理可调整大小的内容,请使用后者指针数组。这需要进行一些更改:

  • realloc来电后的作业变为list->data = rec
  • 您对记录数据的分配使用成员访问权限(.)而不是指针访问权限(->) - 换句话说,list->data[list->nused].name.first而不是list->data[list->nused]->name.first }

另一个微妙的错误是list->nused = list->nused++是错的。它应该是list->nused++list->nused += 1

最后的错误是你正在阅读每一行两次。您可以删除对fgets的第二次通话。

您还应该释放正在分配的内存。将free(list.data)添加到main的末尾。