qsort выдает странные символы в выводе - PullRequest
0 голосов
/ 02 февраля 2019

Я хочу отсортировать данные о сотрудниках по именам.Функция сортировки работает, но выдает странные символы в выводе.Последнее утверждение printf - виновник, я думаю (нижняя часть кода) Если кто-то может помочь, это будет оценено.Спасибо

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


typedef struct
{
   char name[25];
   char firstname[25];
   char job;
   float hrs;
   float rate;
} employee;

int main()
 {
FILE *fp = fopen("employee.dat", "r");
employee staff[30];
    int i = 0;

     if (fp == NULL){
        printf("not working\n");
        exit(1);
     }
     fscanf(fp, "%s %s %c %f %f", staff[i].name, staff[i].firstname, &staff[i].job, &staff[i].hrs, &staff[i].rate);
        while(!feof(fp))
        {
            printf("%s %s %c %4.1f %4.1f \n", staff[i].name, staff[i].firstname, staff[i].job, staff[i].hrs, staff[i].rate);
            i++;
            fscanf(fp, "%s %s %c %f %f", staff[i].name, staff[i].firstname, &staff[i].job, &staff[i].hrs, &staff[i].rate);
        }
     fclose(fp);


// qsort struct function for comparing names
int struct_cmp_by_name(const void *a, const void *b)
{
    employee *ia = (employee *)a;
    employee *ib = (employee *)b;
    return strcmp(ia->name, ib->name);
}

    int structs_len;
    structs_len = sizeof(staff) / sizeof(employee);

// sort on names
qsort(staff, structs_len, sizeof(employee), struct_cmp_by_name);

//output with strange charaters???
for(i=0; i<structs_len; i++){
  printf("%s %s %c %4.1f %4.1f \n", staff[i].name, staff[i].firstname, staff[i].job, staff[i].hrs, staff[i].rate); 
}
     return(0);
}


Я ожидаю регулярного вывода оператора printf.Первый printf работает нормально, но после qsort вместо него отображаются странные символы ??

1 Ответ

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

Наиболее вероятная причина вашей проблемы - сортировка массива целом , даже если, возможно, не все элементы инициализированы.

Если файл содержит менее 30 элементов, которые у вас естьдля массива части массива будут неинициализированными с неопределенным содержимым (которое иногда может казаться случайным или похожим на «мусор»).Вы не должны использовать их при сортировке, только сортируйте данные, которые вы фактически прочитали из файла.

В переменной i есть количество допустимых и инициализированных элементов в массиве, которые вы должны использовать вместо этого:

qsort(staff, i, sizeof(employee), struct_cmp_by_name);

У вас та же проблема при печати данных: вы печатаете весь массив, включая неинициализированные части.

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

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