我正在制作的程序使用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);
}
答案 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的末尾。