将strcpy与链表成员一起使用时出现分段错误

时间:2018-08-22 02:39:11

标签: c linked-list segmentation-fault strcpy

我有一个包含以下数据的文本文件:

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的相应成员中。导致分段故障的线如上所示。感谢您对确定此错误原因的任何帮助。

1 个答案:

答案 0 :(得分:0)

您的问题从这里开始:

strcpy(stdID, Temp);

这会将整个第一行复制到stID中。由于stID只能容纳8个字符,并且第一行超过8个字符,因此您写出了界限,这是未定义的行为。之后,可能会发生任何事情。

您写道您无法使strtok工作。试试这个:

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

int main(void) {
    char str[] = "11111,First,Last,2,COR,100,SEG,200";
    char* p = strtok(str, ",");
    while(p)
    {
        printf("%s\n", p);
        p = strtok(NULL, ",");
    }
    return 0;
}

输出:

11111
First
Last
2
COR
100
SEG
200