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 ответа:
Возможно, вы захотите показать нам, как вы это делаете (Как я должен инициализировать своего сотрудника
readEmployee()
?), и мы бы прокомментировали это.(или что я должен изменить?)
Два вопроса:
Массив для поиска не
MAX_SIZE
длинный, а2
.Итак, эта строка
if (bsearch(&nonExstingEmployee, employeeArray, MAX_SIZE, sizeof(employee_t), compareEmployeesByName) == 0)
Должно быть
if (bsearch(&nonExstingEmployee, employeeArray, 2, sizeof(employee_t), compareEmployeesByName) == 0)
В
compareEmployeesByName()
Вы передаете "неправильный" адрес.Эта строка
if(strcmp(&one->name, &two->name) == 0)
Должен быть
if(strcmp(one->name, two->name) == 0)
Задача проста: вы
qsort
по зарплате ещеbsearch
по имени. Это не сработает.
bsearch
выполняет двоичный поиск в отсортированном массиве . Не любой отсортированный массив, амассив, отсортированный в соответствии с критериями поиска . Вы должны либо предварительно выполнитьqsort
по имени, либо придерживатьсяlsearch
(то есть линейный поиск, который не зависит от предыдущей сортировки).