Как вставить указатель на массив городов в массив городов в порядке сортировки по значению города? - PullRequest
0 голосов
/ 08 февраля 2019

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

Для простоты предположим, что нет ничего плохого в FILE * infile, и массивы были правильно распределены по malloc в отдельном файле.Кроме того, длина инициализируется равной 0, а затем передается в функцию readFile из main в другом файле .c.Так что это не проблема «без границ».

Я посмотрел множество видео на YouTube по указателям (тогда у weewboston было несколько хороших видео), посмотрел http://cslibrary.stanford.edu/106/ и несколько других ресурсов.

Ниже приведен фрагмент моего кода, а не вся программа для простоты, поскольку это просто проблема синтаксиса:

typedef struct cityStruct { unsigned int zip; char * town; } city;
typedef struct zipTownsStruct {
    int * zips;     // indexs to main array cities sorted by zip
    city * * towns; // pointers to main array cities sorted by town name
    city * cities;  // main array of cities in order from file not sorted
} zipTowns;

extern void insertTowns(zipTowns arrs, int * length) {
    int j = (*length) - 1;
    while (j >= 0 && ((strcmp(arrs.towns[j]->town, arrs.cities[*length].town)) > 0)) {
        *arrs.towns[j + 1] = *arrs.towns[j];
        j--;
    }
    *arrs.towns[j + 1] = arrs.cities[*length]; 
}

extern void readFile(zipTowns arrs, FILE * infile, int * length) {
    char * zipCode;
    char * town;
    if((zipCode = malloc(sizeof(char) * 6)) == NULL) {
        fprintf(stderr, "%s\n", strerror(errno));
        exit(errno);
    }
    if((town = malloc(sizeof(char) * 26)) == NULL) {
        fprintf(stderr, "%s\n", strerror(errno));
        exit(errno);
    }
    while(fscanf(infile,"%s %s", zipCode, town) == 2) {
        arrs.cities[*length].zip = atoi(zipCode);
        arrs.cities[*length].town = town; 
        insertZips(arrs, length);
        insertTowns(arrs, length);
        (*length)++;
    }
    free(zipCode);
    free(town);
}

1 Ответ

0 голосов
/ 08 февраля 2019

in

extern void insertTowns(zipTowns arrs, int * length) {
    int j = (*length) - 1;
    while (j >= 0 && ((strcmp(arrs.towns[j]->town, arrs.cities[*length].town)) > 0)) {
        *arrs.towns[j + 1] = *arrs.towns[j];
        j--;
    }
    *arrs.towns[j + 1] = arrs.cities[*length]; 
}

, если length - это количество записей arrs.towns , с которых вы начинаете j = (*length) - 1, поэтому j+1 == *length и *arrs.towns[j + 1]доступ из массива с неопределенным поведением.Вероятно, то же самое в arrs.cities[*length], кажется также странным копировать всегда один и тот же город.

В массиве из элементов length допустимые индексы 0 .. length-1


Предупреждение

zipCode = malloc(sizeof(char) * 5)

позволяет хранить почтовый индекс максимум из 4 символов, чтобы иметь место для завершающего нулевого символа (во Франции почтовый индекс использует 5 символов, может быть не так дляВы, но вы не предоставляете достаточно информации, позволяющей нам знать)


Трудно сказать больше, потому что вы не приводите Минимальный, Полный и Проверяемый пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...