C 如何在字符串数组上使用二进制搜索

C 如何在字符串数组上使用二进制搜索,c,struct,binary-search,C,Struct,Binary Search,我必须只使用我在课堂上学到的东西来编写一个程序,在这个程序中,我注册了一辆汽车的信息,对其进行排序,然后使用二进制搜索来搜索汽车牌照。如果找到了车牌,则打印有关该特定车辆的所有信息,如果不选择“未找到”,则返回-1。在进行二进制搜索之前,一切正常,问题是它找不到车牌,它总是返回-1 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_CARRO 5 // DEFINE

我必须只使用我在课堂上学到的东西来编写一个程序,在这个程序中,我注册了一辆汽车的信息,对其进行排序,然后使用二进制搜索来搜索汽车牌照。如果找到了车牌,则打印有关该特定车辆的所有信息,如果不选择“未找到”,则返回-1。在进行二进制搜索之前,一切正常,问题是它找不到车牌,它总是返回-1

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

#define MAX_CARRO 5  // DEFINE TAMANHO DA STRUCT

typedef struct   // STRUCT
{
    char placa[50];
    char marca[50];
    char modelo[50];
    char ano[50];
    char valordiaria[50];
} carro;
carro car[MAX_CARRO];

int compare (const void * a, const void * b)
{    
    carro *carroA = (carro *)a;
    carro *carroB = (carro *)b;   

    return strcmp(carroA, carroB);
}

int main()
{
    int x=0; //COUNTER

    for(x=0; x<MAX_CARRO; x++) // CAR REGISTER
    {    
        printf("\nCarro: %d", (x+1));

        printf("\nPlaca: ");
        scanf("%s",car[x].placa);    

        printf("Marca: ");
        scanf("%s",car[x].marca);    

        printf("Modelo: ");
        scanf("%s",car[x].modelo);    

        printf("Ano: ");
        scanf("%s",car[x].ano);    

        printf("Valor da diaria: ");
        scanf("%s",car[x].valordiaria);    
    }    

    qsort (car, MAX_CARRO, sizeof(carro), compare);  // USO DO QSORT

    printf("\n\nSTRUCT ORDENADA: \n");
    for(x=0; x<MAX_CARRO; x++) // MOSTRA NA TELA A STRUCT ORDENADA
    {
        printf("\n\n\nCarro: %d", (x+1));
        printf("\nPlaca: %s", car[x].placa);
        printf("\nMarca: %s", car[x].marca);
        printf("\nModelo: %s", car[x].modelo);
        printf("\nAno: %s", car[x].ano);
        printf("\nValor da diaria: %s", car[x].valordiaria);
    }

    char k[10];

    //           *****BINARY SEARCH******    
    printf("\n\n\n*****BUSCA DE PLACAS*****\n\n\n\n");
    printf("Digite a placa que deseja procurar: \n");
    scanf("%s", &k);

//              ***PROBLEM***     

    int low, high, mid;

    low=0;
    high = MAX_CARRO-1;
    while(low<=high)
    {
        mid = (low+high)/2;

        if (strcmp(k, car[mid].placa)<0)
            high=mid-1;    

        else if (strcmp(k, car[mid].placa)>0)
            low=mid+1;    

        else
        {
            printf("\nPlaca: %s", car[mid].placa);
            printf("\nMarca: %s", car[mid].marca);
            printf("\nModelo: %s", car[mid].modelo);
            printf("\nAno: %s", car[mid].ano);
            printf("\nValor da diaria: %s", car[mid].valordiaria);
        }    

        printf("\n\n****Not found****\n\n\n");
        return -1; //     
    }    
}
#包括
#包括
#包括
#定义MAX_CARRO 5//定义TAMANHO DA结构
typedef struct//struct
{
char placa[50];
char marca[50];
charmodelo[50];
charano[50];
char Valordaria[50];
}卡罗;
卡罗轿车[马克斯·卡罗];
整数比较(常数无效*a,常数无效*b)
{    
卡罗*卡罗亚=(卡罗*)a;
卡罗*卡罗布=(卡罗*)b;
返回strcmp(carroA,carroB);
}
int main()
{
int x=0;//计数器
对于(x=0;x您几乎没有bug

第一个在compare()函数中,不能写这行

return strcmp(carroA, carroB);
因为strcmp只处理char*类型,而carroA和carroB是carro*类型。您应该放置

 return strcmp(carroA->placo, carroB->placo);
现在,您将根据placo的值对结构进行排序

现在让我们看看您的主要功能

main()中的第一个bug在您的代码行中

  scanf("%s", &k);
你不需要&,你应该这样做

  scanf("%s",k);
第二个bug在最后一行的while()循环中

  return -1;
这是一件大事,因为main()将返回-1

也许您应该使用一个变量来确定您是否在二进制搜索中找到了要查找的内容

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

#define MAX_CARRO 5  // DEFINE TAMANHO DA STRUCT

typedef struct   // STRUCT
{
    char placa[50];
    char marca[50];
    char modelo[50];
    char ano[50];
    char valordiaria[50];
} carro;
carro car[MAX_CARRO];

int compare (const void * a, const void * b)
{    
    carro *carroA = (carro *)a;
    carro *carroB = (carro *)b;   

    return strcmp(carroA->placa, carroB->placa);
}

int main()
{
    int x=0; //COUNTER

    for(x=0; x<MAX_CARRO; x++) // CAR REGISTER
    {    
        printf("\nCarro: %d", (x+1));

        printf("\nPlaca: ");
        scanf("%s",car[x].placa);    

        printf("Marca: ");
        scanf("%s",car[x].marca);    

        printf("Modelo: ");
        scanf("%s",car[x].modelo);    

        printf("Ano: ");
        scanf("%s",car[x].ano);    

        printf("Valor da diaria: ");
        scanf("%s",car[x].valordiaria);    
    }    

    qsort (car, MAX_CARRO, sizeof(carro), compare);  // USO DO QSORT

    printf("\n\nSTRUCT ORDENADA: \n");
    for(x=0; x<MAX_CARRO; x++) // MOSTRA NA TELA A STRUCT ORDENADA
    {
        printf("\n\n\nCarro: %d", (x+1));
        printf("\nPlaca: %s", car[x].placa);
        printf("\nMarca: %s", car[x].marca);
        printf("\nModelo: %s", car[x].modelo);
        printf("\nAno: %s", car[x].ano);
        printf("\nValor da diaria: %s", car[x].valordiaria);
    }

    char k[10];

    //           *****BINARY SEARCH******    
    printf("\n\n\n*****BUSCA DE PLACAS*****\n\n\n\n");
    printf("Digite a placa que deseja procurar: \n");
    scanf("%s", k);

//              ***PROBLEM***     

    int low, high, mid;

    low=0;
    high = MAX_CARRO-1;
    int found=0;
    while(low<=high && !found)
    {
        mid = (low+high)/2;

        if (strcmp(k, car[mid].placa)<0)
            high=mid-1;    

        else if (strcmp(k, car[mid].placa)>0)
            low=mid+1;    

        else
        {
            found = 1;
            printf("\nPlaca: %s", car[mid].placa);
            printf("\nMarca: %s", car[mid].marca);
            printf("\nModelo: %s", car[mid].modelo);
            printf("\nAno: %s", car[mid].ano);
            printf("\nValor da diaria: %s", car[mid].valordiaria);
        }    


    } 
    if(!found)
        printf("\n\n****Not found****\n\n\n");
 return 0; //
}
#包括
#包括
#包括
#定义MAX_CARRO 5//定义TAMANHO DA结构
typedef struct//struct
{
char placa[50];
char marca[50];
charmodelo[50];
charano[50];
char Valordaria[50];
}卡罗;
卡罗轿车[马克斯·卡罗];
整数比较(常数无效*a,常数无效*b)
{    
卡罗*卡罗亚=(卡罗*)a;
卡罗*卡罗布=(卡罗*)b;
返回strcmp(carroA->placa,carroB->placa);
}
int main()
{
int x=0;//计数器

对于(x=0;x编译器应该向您发出警告。至少对于
compare
中的调用。您知道这是用于比较字符串的,而且
carroA
carroB
都不是字符串。您应该认真听编译器告诉您的内容。顺便说一句,如果您能够正确使用
qsort
,您可以同样也可以使用
b搜索,它非常类似。如果这是学校用的,那么至少可以使用它来验证二进制搜索的实现是否正确。
scanf(“%s”,&k);
您应该检查参数的预期类型。以及您提供的类型。此外,您的循环中没有任何可能的执行流,这不会导致
返回-1
。您不会再次执行循环。并且在
比较()中对
(carro*)
进行强制转换
是完全没有必要的-这就是29年前引入语言标准的类型
void*
的全部要点。不是使用
返回1退出main,而是使用
返回退出失败
返回1相当于返回退出失败,返回0相当于返回退出成功错误-是在t中他解释了编辑评论的过程