Ошибка сегментации при чтении нескольких строк из текстового файла посимвольно - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь прочитать строки из файла, по одному символу за раз.

Пример ввода:

5 2
2
1 3
2 4 5
3

Предположим, я пытаюсь прочитать первую строку, затем я сначала читая '5', затем пробел ('') и затем '2', а затем пытаясь сохранить два числа в массиве, который я объявил, используя realloc, потому что я не знаю, сколько чисел будет быть там в строке, прежде чем читать строку. Я знаю только количество строк, которые будут присутствовать в файле numNodes.

. Я пытаюсь сохранить числа в двумерном массиве, где каждая строка будет иметь разную длину rnet. Поскольку я не знаю заранее длины каждой строки, я выделяю память, используя realloc после прочтения каждого числа.

Поскольку числа могут быть более чем однозначными, я храню символы в num массив символов, и когда я сталкиваюсь с пробелом ('') или символом новой строки ('\ n'), я конвертирую его в число, используя atoi, и сохраняю его в подходящей строке после выделения памяти для него, используя * 1015. *.

вот мой код

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. Изменено ch на &ch в fscanf строке

  2. Изменено ch[0] на ch (if оператор)

  3. Добавлено adjlist[i] = NULL перед do...while л oop

1 Ответ

1 голос
/ 13 февраля 2020
    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';
    }

Когда вы закончите sh чтение одного числа k будет 4.

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

И вы начнете читать следующее число с помощью k >= 4, таким образом, доступ за пределы num.

        num[k]=ch;
        k++;

Также вам необходимо завершить num символом \0 для использования с atoi.

num[k] = '\0';
adjList[i][len-1] = atoi(num);
...