C b按名称进行比较的搜索()

C b按名称进行比较的搜索(),c,function,struct,bsearch,C,Function,Struct,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*)*

我有一个
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("beforesort\n");

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

    puts("after salary sort\n");
    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;
    }
我正在比较
nonExstingEmployee
(存在于测试数组中)和我的
employeeArray

我应该如何初始化我的员工

您可能希望向我们展示您是如何做到这一点的(
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)
    
    if(strcmp(one->name, two->name) == 0)
    
  • compareeemployeesbyname()
    中,传递的地址“错误”

    这条线

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

    if (bsearch(&nonExstingEmployee, employeeArray, 2, sizeof(employee_t), compareEmployeesByName) == 0)
    
    if(strcmp(one->name, two->name) == 0)
    

  • 问题很简单:你是按工资排序,还是按姓名搜索。这行不通


    b搜索
    在排序数组中执行二进制搜索。不是任何已排序的数组,而是根据搜索条件排序的数组。您必须先按名称执行
    qsort
    ,或者坚持执行
    lsearch
    (这是不依赖于先前排序的线性搜索)。

    对于初学者:这
    如果(strcmp(&one->name,&two->name)==0)
    看起来不太好,编译器应该向您发出警告。是的,可能会被捕获!完全错过了这个…:}这是我的readEmployee:
    void readEmployee(employee_t*emp){fflush(stdin);printf(“请输入员工姓名:(最多19个字符)”);scanf(“%s”,emp->name);fflush(stdin);printf(“请输入员工工资:”;scanf(“%d”和(emp->salary));fflush(stdin);printf(“请输入员工经验:”;scanf(“%d”,&(emp->experience));}
    im正在比较nonExstingEmployee(存在于数组中用于测试)和my employeeArray