【问题标题】:Segmentation Fault when using strcpy with a linked list member将 strcpy 与链表成员一起使用时出现分段错误
【发布时间】: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


【解决方案1】:

你的问题从这里开始:

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

【讨论】:

  • 我让 strtok 为第一行工作,但在循环获取第二行时会出现段错误。我现在将尝试扩大 stdID 的大小,我会尽快回复您。谢谢
  • 在扩展 stdID 的大小时仍然出现分段错误
  • @user7438591 你是如何改变stdID 的?新尺寸?
  • 是的,只是将大小更改为 256
  • 我也刚刚尝试再次使用 strtok(因为我之前保存了代码)但是这一次,所有 strtok 调用都在一个不同的函数中,然后由上述函数调用,并且导致段错误
猜你喜欢
  • 2013-12-27
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2018-03-17
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多