разбиение строки в файле и сохранение значений в массиве выводит неверный вывод - PullRequest
0 голосов
/ 23 декабря 2018

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 100

int main(){
  char *lines = malloc(max*sizeof(char));

    char **names = malloc(max*sizeof(char));
    int *ages =malloc(max*sizeof(int));

    FILE *fp;
    fp = fopen("config2.txt", "r");
    if(fp == NULL){
        printf("Cannot open filelist.txt\n");
        return 1;
    }
int i= 0;
    while (i < max && fgets(lines, sizeof(lines), fp) != NULL) {
        sscanf(lines, "%s %d", names[i], &ages[i]);
        printf("%d", ages[i]);
        printf("%s", names[i]);

        i++;
    }

return 0;
}

Ввод:

Felix         9
Jonathan  50
Felix         18
Jonathan  50
Felix         90
Jonathan  50
Felix         24
Jonathan  50
Felix         76
Jonathan  50
Felix         56
Jonathan  50
Felix         21
Jonathan  50

1 Ответ

0 голосов
/ 23 декабря 2018

Здесь

char **names = malloc(max*sizeof(char));

names имеет тип char**, т.е. вам нужно выделить память для names сначала, что вы сделали выше, а затем вам нужно выделить память для names[row], которую вынет, поэтому, когда это

sscanf(lines, "%s %d", names[i], &ages[i]);

выполняется, это вызывает ошибку сегментации, так как для names[i].

не было выделено памяти. И что может быть sizeof(lines)?Это просто 4 байт в 32 битной системе.Измените его на MAX_LENGTH, где MAX_LENGTH - это не более чем максимальная длина строки в файле.

while (i < max && fgets(lines, MAX_LENGTH, fp) != NULL) { /* read MAX_LENGTH char from file and store into lines */
        names[i] = malloc(MAX_LENGTH); 
        sscanf(lines, "%s %d", names[i], &ages[i]);
        printf("%d", ages[i]);
        printf("%s", names[i]);

        i++;
    }

И в конце, когда использование будет завершено, не забудьте освободить динамически распределенную памятьизбежать утечки памяти.

...