c - 如何在字符串数组上使用二分查找

标签 c struct binary-search

我必须仅使用我在类里面学到的东西编写一个程序,在其中注册汽车信息,对其进行排序并使用二进制搜索来搜索汽车的车牌。如果找到车牌,则打印有关该特定汽车的所有信息,如果不打印“未找到”并返回-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; //     
    }    
}

最佳答案

你的错误很少。

第一个在您的compare()函数中。你不能写这一行

return strcmp(carroA, carroB);

因为 strcmp 仅适用于 char* 类型,而 carroA 和 carroB 属于 carro* 类型。你应该放置

 return strcmp(carroA->placo, carroB->placo);

现在您将根据 placo 的值对结构进行排序。

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

main() 中的第一个错误出现在您的代码行中

  scanf("%s", &k);

你不需要&,你应该这样做

  scanf("%s",k);

第二个错误是在最后一行的 while() 循环中

  return -1;

这是一件大事,因为 main() 将返回 -1。如果你想让 main() 像发生错误一样退出,你应该写 return 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; //
}

关于c - 如何在字符串数组上使用二分查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50352728/

相关文章:

c - 变量定义应该在头文件中吗?

c - 从不兼容的指针类型赋值——如何解决?

c - GS 结构体列表

c - typedef 语法说明

python - 调试二进制搜索

c - double free 错误释放 1000 字节

c - 链表段错误(信号 11 sigsegv)

c - 在链接列表中对空指针进行类型转换

python - 在列表中执行二分搜索 - Python

r - 在 data.table 中查找匹配项的行索引(我可以进行二分搜索吗?)