我的项目是读取.txt文件,其中包含学生的姓名,我必须输入他们的分数(最多5个输入)和名称应该是链接列表,如我的附件图片所示。
我遇到的一个问题是,当我尝试输入第三个学生的分数数据时,程序会崩溃,我认为这是一个内存溢出的问题,但我不知道如何删除任何部分以释放内存,因为所有链表都用于指向彼此。
如果有人能告诉我可能出现什么问题,我将不胜感激。抱歉我的英语很差,非常感谢你。
我的代码和txt文件如下。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct nodeName {
char *name;
struct nodeName *linkToName;
struct nodeScore *linkToScore;
};
struct nodeScore {
int score;
struct nodeScore *linkNextScore;
};
struct nodeName *insertName(struct nodeName *ptr, char *nameIn);
struct nodeName *insertScore(struct nodeName *ptr);
void displayList(struct nodeName *ptr);
struct nodeName *insertName(struct nodeName *ptr, char *nameIn) {
struct nodeName *n = (struct nodeName *)malloc(sizeof(struct nodeName));
int counter = 0;
int scoreTemp;
char checkInt;
char *tag;
struct nodeScore *tempS;
tag = nameIn;
n->name = tag;
while (counter < 5) {
struct nodeScore *s = (struct nodeScore *)malloc(sizeof(struct nodeScore));
counter++;
printf("Enter %d Score of %s:", counter, tag);
if (scanf("%d%c", &scoreTemp, &checkInt) != 2 || checkInt == 'n') {
printf("\nEnd saving %s's score.\n", tag);
break;
}
s->score = scoreTemp;
if (n->linkToScore == NULL) //for the first link to node of score.
n->linkToScore = s;
else
tempS->linkNextScore = s;
s->linkNextScore = NULL;
tempS = s;
}
ptr = n;
return ptr;
}
int main() {
FILE *nameF = fopen("HW5_26.txt", "r");
char input[512];
char *SingleName;
struct nodeName *p1, *temp;
int testN1 = 0;
while (fgets(input, 512, nameF)) { //get file line by line
SingleName = strtok(input, " "); //if 'space' or 'New line', save as a single name.
printf("\n");
printf("Name# %d = %s\n", ++testN1, SingleName);
printf("\n");
p1 = insertName(p1, SingleName);
temp = p1;
while (SingleName != NULL) {
SingleName = strtok(NULL, " "); //put n name into SingleName
if (SingleName != NULL) {
printf("___________________________\n\n");
printf("Name# %d = %s\n", ++testN1, SingleName);
printf("\n");
p1 = insertName(p1, SingleName);
temp->linkToName = p1;
temp = p1;
}
}
}
return 0;
}
HW5_26.txt
的内容Albert Steve David Mike
Andrew Joanne Chris Fred
Dennis Leo Fred Frances
Dave Hua Sarah
答案 0 :(得分:1)
您的代码中存在重大设计问题:
您应该允许多个名称:Albert Einstein
是2个字。名称文件每行应包含一个全名。使用fgets()
阅读并使用str[strcspn(str, "\n")] = '\0';
您应该将所有标记作为一行阅读,并使用strtol()
进行解析。如果未移动strtol()
更新的指针,则表示您已阅读所有标记。
您插入名称的代码不会将该节点附加到Student
列表。
函数insertName()
应该复制带有strdup()
或等效字符串的字符串。编码后,所有节点的名称都指向main
函数中同一缓冲区的某些部分,每次调用都会覆盖fgets()
。
您声明了insertScore
函数但不使用它。为清晰起见,最好将代码移到单独的函数中。
您应该检查fopen
和malloc
的返回值,以便优雅地处理错误。
您可以使用typedef
删除struct
个关键字,并使代码更易于阅读。