逐个字符地从文本文件中读取多行时出现分段错误

Segmentation Fault while reading multiple lines from a text file character-by-character

我正在尝试从文件中读取行,一次一个字符。

输入示例:

5 2
2
1 3
2 4 5
3

假设我正在尝试读取第一行,然后我先读取“5”,然后是 space(“”),然后是“2”,然后尝试存储这两个数字在一个数组中,我使用 realloc 声明它,因为我不知道在读取该行之前一行中会有多少数字。 我只知道文件中将出现的行数 numNodes.

我正在尝试将数字存储在二维数组中,其中每一行的长度都不同。 由于我事先不知道每行的长度,因此我在读取每个数字后使用 realloc 分配内存。

由于数字可以超过一位,我将字符存储在 num 字符数组中,当我遇到 space(' ') 或换行符('\n' ), 我使用 atoi 将其转换为数字,并在使用 realloc.

为其分配内存后将其存储在合适的行中

这是我的代码

FILE *fp;

fp = fopen("input.txt","r");

char ch;
int numNodes = 5, i = 0;

int **adjList = (int **)malloc(numNodes*sizeof(int *));

int len = 0,j,k=0;
char num[4];

for(i=0;i<numNodes;i++)
{
    adjList[i] = NULL;
    printf("Node %d -> ",i+1);
    do
    {
        //read = 
        fscanf(fp,"%c",&ch);
        if(ch!=' ' && ch!='\n')
        {
            num[k]=ch;
            k++;
        }
        else
        {
            k = 0;
            len++;
            adjList[i] = (int *)realloc(adjList[i],sizeof(int)*len);
            adjList[i][len-1] = atoi(num);
            for(k=0;k<4;k++)
                num[k]='0';
        }

    }
    while(ch!='\n');

    for(j=0;j<len;j++)
        printf("%d ",adjList[i][j]);
    printf("\n");

    len = 0;
}

但是,我在最后一行得到 Segmentation Fault (core dumped),也就是说,在打印 2 4 5 之后。

感谢任何帮助,为什么最后一行出现此错误?

编辑 :

  1. fscanf

  2. 中将 ch 更改为 &ch
  3. 已将 ch[0] 更改为 chif 语句)

  4. do...while 循环之前添加 adjlist[i] = NULL

    fscanf(fp,"%c",&ch);
    if(ch!=' ' && ch!='\n')
    {
        num[k]=ch;
        k++;
    }
    else
    {
        k = 0;
        len++;
        adjList[i] = (int *)realloc(adjList[i],sizeof(int)*len);
        adjList[i][len-1] = atoi(num);
        for(k=0;k<4;k++)
            num[k]='0';
    }

当您读完一个数字后 k 将是 4

    for(k=0;k<4;k++)
        num[k]='0';

然后您开始使用 k >= 4 读取下一个数字,因此超出了 num 的范围。

        num[k]=ch;
        k++;

您还需要使用 [=19=] 字符终止 num 以与 atoi 一起使用。

num[k] = '[=13=]';
adjList[i][len-1] = atoi(num);