【发布时间】:2019-01-28 06:16:51
【问题描述】:
我有一个包含以下数据的文本文件:
11111,First,Last,2,COR,100,SEG,200
22222,F,L,1,COR,100
33333,Name,Name,3,COR,100,SEG,200,CMP,300
***
我需要分隔每一行中的数据(在逗号处)并将每一行数据添加到一个链表中。这是我用来执行此操作的一段代码:
struct courseInfo{
int courseID;
char courseName[30];
};
typedef struct courseInfo cInf;
struct studentInfo{
char studentID[8];
char firstN[20];
char lastN[25];
int nCourses;
cInf courseInf[10];
struct studentInfo *next;
};
typedef struct studentInfo sInf;
void loadStudentInfo(){
FILE *loadFile;
loadFile = fopen("studentRecords.txt", "r");
while(1){
sInf *loadStudent;
loadStudent = (sInf*)malloc(sizeof(sInf));
char Temp[256];
fgets(Temp,256,loadFile);
if (Temp[0] == '*')
break;
int commaCount = 0;
int i = 0;
while(Temp[i] != '\0'){
if(Temp[i] == ',' && commaCount == 0){
char stdID[8];
strcpy(stdID, Temp);
int commaLoc = 0;
while(stdID[commaLoc] != ','){ //Finds where stdID ends
commaLoc++;
}
for(;commaLoc < 8; commaLoc++){ //Delimits stdID, 8 is the max size of studentID
stdID[commaLoc] = '\0';
}
printf("%s\n", stdID);
strcpy(loadStudent ->studentID, stdID); //Causing segmentation fault
commaCount++;
}
现在,我为分隔每一行中的数据所做的工作可能不是最有效的,但我尝试使用 strtok() (它可以很好地读取第一行但在读取第二行时导致分段错误)并且尝试使用 fscanf 和 %[^,] 但它对我不起作用。无论如何,我认为我用来分离数据的方法不会导致分段错误。此循环将继续将其余数据分离并存储在 loadStudent 的适当成员中。导致分段错误的行如上所示。任何有关确定此错误原因的帮助表示赞赏。
【问题讨论】:
-
我认为你遗漏了
typedef struct studentInfo sInf; -
另外,这个程序不能出现段错误。它处于无限循环中,因为您的
while条件始终为真,但其中if的条件始终为假。提示:i永远不会增加。 -
是的,正如我之前所说,我只放了导致我出现 seg 错误的部分。我有我在下面递增,但我没有复制它。
-
假设没有无限循环(因为没有),并且 i 正在递增(因为它是)。
-
strcpy(stdID, Temp);不是要在 8 个字符宽的缓冲区stdId上复制大约 35 个字符(即文件的整个第一行)吗?这可能足以破坏堆栈中的其他变量并给你随机行为。
标签: c linked-list segmentation-fault strcpy