0

我有一个代码,它将位于另一个双向链接列表内的双向链接列表中的学生编号(stdnum)保存到文件中。我注意到有时,它会打印“(null)”和额外的空格。我该如何避免这些?这是我的代码:

typedef struct frn{ //structure for friend
char stdnum[20];
struct frn *next;
struct frn *prev;
}friend;

typedef struct std{ //structure for student
char stdnum[20];
char name[20];
char course[10];
struct frn *friendh; 
struct frn *friendt;
struct std *next;
struct std *prev;
}student;



FILE *fp1;
student *y = h->next;
friend *y1;
fp1 = fopen("friends.txt", "w");
    if(y != t){
        while(y != t){
            y1 = y->friendh;
            while(y1 != NULL){ 
                fprintf(fp1, "%s\n", y1->prev->stdnum);
                y1 = y1->next;
            }
            y = y->next;
        }
    }
fclose(fp1);
4

2 回答 2

0

有几点需要注意:

  • 您不应该使用名称“friend”,因为它是 C++ 中的关键字

  • 检查是否可以打开文件

  • 第一个 if (if(y != t)) 是不必要的(已经被 while 循环覆盖了

  • 什么是“t”?是特殊的学号吗?

  • 您正在打印字符串 (%s),而不是数字 (%d)。您是否将学生编号保存为字符串?

  • 请向我们展示学生的结构。不知道你是如何建立你的清单的,很难回答你的问题

于 2013-10-06T03:51:49.497 回答
0

阅读您的评论后,这就是它打印 NULL 的原因:

fprintf(fp1, "%s\n", y1->prev->stdnum)

当您位于链表的第一个节点(y1)(第一次进入该内部 while 时)时会发生什么?当您执行 y1->prev->stdnum时,您正在访问随机内存或者如果您已将链接列表初始化为空值的 NULL 值。这就是打印出来的。

然后在打印之后直接null执行y1 = y1->next。这会将您带到链表的第二个节点。

现在再次执行:

fprintf(fp1, "%s\n", y1->prev->stdnum)

现在您正在打印第一个节点的“stdnum”值,您在评论中提到它是空的。所以fprintf打印出一个空白空间。

你能验证nullblank space是紧挨着出现的吗?

你可以像这样修复它:

typedef struct frn{ //structure for friend
    char stdnum[20];
    struct frn *next = NULL;
    struct frn *prev = NULL;
}friend;

fp1 = fopen("friends.txt", "w"); // I would highly recommend, you put an error check here to verify if the file opened or not 
if(y != t){
    while(y != t){
        y1 = y->friendh;
        while(y1 != NULL){ 
            if(y1->prev==NULL){
               y1 = y1->next;
            }else{
            fprintf(fp1, "%s\n", y1->prev->stdnum);
            y1 = y1->next;
            }
        }
        y = y->next;
    }
}
fclose(fp1);
于 2013-10-06T06:42:44.883 回答