bsearch () сравнение по имени


У меня есть struct employee компараторы и main:

#define MAX_SIZE 20
typedef struct Employee{
    char name[MAX_SIZE];
    int salary;
    int experience;
} employee_t;

void main()
{
    int i;

    employee_t** employeeArray = (employee_t**)malloc(sizeof(employee_t*)*5);
    employee_t nonExstingEmployee = {"v"};

    for(i=0 ; i < 2 ; i++)
    {
        employeeArray[i] = (employee_t*)malloc(sizeof(employee_t));  //alocate each employee
        readEmployee( employeeArray[i] ); 
    }

    puts("beforesortn");

    for(i=0; i <2 ; i++)
    {
        printEmployee(employeeArray[i]);
    }

    puts("after salary sortn");
    qsort(employeeArray, 2, sizeof(employee_t*), compareEmployeesBySalary);
    for(i=0; i < 2 ; i++)
        printEmployee( employeeArray[i] );

    if (bsearch(&nonExstingEmployee, employeeArray, MAX_SIZE, sizeof(employee_t), compareEmployeesByName) == 0)
        puts("employee found");
    else
        puts("no employee found");

}


    int compareEmployeesBySalary(const void* a, const void* b){
            employee_t* one = *(employee_t **)a;
            employee_t* two = *(employee_t **)b;

            if (one->salary == two->salary)
                return 0;
            else if (one->salary > two->salary)
                return 1;
            else
                return -1;
    }

    int compareEmployeesByName(const void* a,const void* b)
    {
        employee_t* one = *(employee_t**)a;
        employee_t* two = *(employee_t**)b;

        if(strcmp(&one->name, &two->name) == 0)
        {
            return 1;
        }

        return 0;
    }

Мне нужно использовать bsearch сравнение имен (с каким-то сотрудником, которого нет в массиве), моя функция qsort работает (сравнение по зарплате) независимо от того, как я инициализирую сотрудника для bsearch, он всегда говорит, что его нет (я пытаюсь сначала проверить это с существующим сотрудником),

Как я должен инициализировать своего сотрудника (или что я должен изменить?)


[обновление из комментария:]

Это мой readEmployee():

void readEmployee(employee_t *emp)
{
  fflush(stdin);
  printf("Please enter Employee's name:(max 19 chars)");
  scanf("%s", emp->name);

  fflush(stdin);
  printf("Please enter Employee's salary:");
  scanf("%d", &(emp->salary));

  fflush(stdin);
  printf("Please enter Employee's experience:");
  scanf("%d", &(emp->experience));
}

Я сравниваю nonExstingEmployee (которые существуют в массиве для тестирования) и мой employeeArray.

2 3

2 ответа:

Как я должен инициализировать своего сотрудника

Возможно, вы захотите показать нам, как вы это делаете (readEmployee()?), и мы бы прокомментировали это.

(или что я должен изменить?)

Два вопроса:

  1. Массив для поиска не MAX_SIZE длинный, а 2.

    Итак, эта строка

    if (bsearch(&nonExstingEmployee, employeeArray, MAX_SIZE, sizeof(employee_t), compareEmployeesByName) == 0)
    

    Должно быть

    if (bsearch(&nonExstingEmployee, employeeArray, 2, sizeof(employee_t), compareEmployeesByName) == 0)
    
  2. В compareEmployeesByName() Вы передаете "неправильный" адрес.

    Эта строка

    if(strcmp(&one->name, &two->name) == 0)
    

    Должен быть

    if(strcmp(one->name, two->name) == 0)
    

Задача проста: вы qsort по зарплате еще bsearch по имени. Это не сработает.

bsearch выполняет двоичный поиск в отсортированном массиве . Не любой отсортированный массив, амассив, отсортированный в соответствии с критериями поиска . Вы должны либо предварительно выполнить qsort по имени, либо придерживаться lsearch (то есть линейный поиск, который не зависит от предыдущей сортировки).