Почему sscanf читает только две строки с указателем на указатель? - PullRequest
0 голосов
/ 02 августа 2020

У меня есть файл с 10 строками, и в каждой строке есть, разделенные пробелами, имя, идентификатор и возраст. Проблема в том, что при чтении этого файла с помощью fgets и sscanf он возвращает мне ошибку сегмента при попытке прочитать более двух строк.

typedef struct Person
{
    char name[1024];
    long id;
    float age;
} Person;

    int main(int argc, char *argv[])
{
    FILE *inputPeople = fopen(argv[1], "r");
    Person *arrPersons = NULL;
    if (assignInputPeople(&arrPersons, inputPeople]) == EXIT_FAILURE)
    {
        return EXIT_FAILURE;
    }


*arrPersons = (Person*)malloc(10 * sizeof(Person));

int assignInputPeople(Person **arrPersons,  FILE *inputPeople)
{
    int counter = 0;
    char fileLine[MAX_LENGTH_LINE];
    long ID;
float ageF;
 while (fgets(fileLine, MAX_LENGTH_LINE, inputPeople) != NULL)
    {
        sscanf(fileLine, "%s %s %s", arrPersons[counter]->name,&ID,
            &ageF);
        counter++;
        printf("%s\n",fileLine);
        (*arrPersons)[counter].age = ageF;
        (*arrPersons)[counter].id = ID;
        if (counter == capacity)
    {
        capacity += CAPACITY;
        *arrPersons = (Person*)realloc(*arrPersons, capacity*sizeof(Person));
        if (*arrPersons == NULL)
        {
            return EXIT_FAILURE;
        }
    }
}

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

1 Ответ

2 голосов
/ 02 августа 2020

Если вы передаете адрес arrPersons в функции main() в качестве аргумента arrPersons функции assignInputPeople(), arrPersons[counter]->name неверно, потому что то, на что указывает arrPersons, имеет только место для one ele mnet, поэтому он выходит за пределы допустимого диапазона, когда counter не 0.

В этом случае это должно быть (*arrPersons)[counter].name.

...