сортировка массива структуры - PullRequest
0 голосов
/ 30 сентября 2019

Я прочитал текстовый файл и сохранил данные в массиве struct, затем попытался отсортировать его и распечатать несортированные и отсортированные массивы. Он работает до чтения текста массива и сохранения в массиве, но функция сортировки не работает без каких-либо ошибок. что с этим не так? Я использовал функцию strcmp() для сравнения student[s]:

#include <stdio.h>

struct person { //struct person with 4 fields
    char name[100];
    char address[100];
    char IDnumber[20];
    int  age;
};

int main (void) {
    FILE *file = fopen ( "personout.txt", "r");
    struct person student[10]; // declares an struct array to store data
    int k = 0;
    if (file != NULL) {
        char line[300];
        while ( k < 10 && fgets ( line, sizeof line, file ) != NULL ) {
            if ( 4 == sscanf ( line, " %99[^,], %99[^,], %19[^,], %d", 
                student[k].name, student[k].address, student[k].IDnumber, &student[k].age))
            {
                printf ( "%s\n Un-sorted array");
                printf ( "%s\n", student[k].name);
                printf ( "%s\n", student[k].address);
                printf ( "%s\n", student[k].IDnumber);
                printf ( "%d\n", student[k].age);
                k++;
            }
        }
        fclose ( file );
    }
    sortarray();

    // prints sorted array
    printf ( "%s\n Sorted array");
    for (int t=0;t<10;t++) {
        printf ( "%s\n", student[t].name);
        printf ( "%s\n", student[t].address);
        printf ( "%s\n", student[t].IDnumber);
        printf ( "%d\n", student[t].age);
        t++;
    }
}

void sortarray(){
    // number of records a  r=a first for loop
    // inner for loop s=r+1
    struct person temp,student[10];
    int a=10;
    for (int r=0;r<a-1;r++) {
        for (int s=r+1;r<a;s++) {
            if (strcmp(student[r].name, student[s].name) > 0) {
                temp = student[r];
                student[r] =student[s];
                student[s] = temp;
            }
        }
    }
}

1 Ответ

2 голосов
/ 30 сентября 2019

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

Массив student в функции main не совпадаетМассив student в функции sortarray. Массив в функции sortarray будет неинициализирован, и попытка его сортировки приведет к неопределенному поведению .

Решение состоит в том, чтобы передать указатель на первый элемент массива изmain функция, поэтому функция sortarray может использовать ее. Для этого необходимо три изменения:

  1. Добавить предварительное объявление функции sortarray:

    void sortarray(struct person *);
    
  2. Вызвать функцию, передав указатель напервый элемент:

    sortarray(student);  // As arrays decays to pointers, this is like passing &student[0]
    
  3. Удалите определение массива student в функции sortarray.

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