目前我正在努力修改基本搜索功能。
好吧,我让它工作,并搜索列表包含的任何名称,但如果我想通过其名称的一部分搜索某些东西,例如,如果名称是香蕉,我输入Bana,它会给我香蕉。
搜索功能:
void * PesquisaProdutos(PLISTA v1, int(*compara)(), void* valor) {
int i;
for (i = 0; i < v1->posicao;i++)
if ((*compara)(v1->cabeca[i], valor))
return v1->cabeca[i];
return NULL;
}
比较功能:
int cmpDescricaoProduto(PLISTAPRODUTOS p, char* nome) {
return strcmp(p->Descricao, nome) == 0;
}
和主要部分:
printf("Insira o Nome: ");
scanf("%s", &Descricao);
getch();
Pesquisar = PesquisaProdutos(&Produtos, cmpDescricaoProduto, Descricao);
if (Pesquisar) printf("Descricao : %s", Descricao);
else printf("Produto Inexistente");
getch();
break;
如果可能,我想听听一些想法,谢谢。
答案 0 :(得分:3)
如果您只想查看字符串的前几个字符,可以使用strncmp
。它允许您指定要检查的最大字符数。
所以:
strncmp ("banana", "ban", 3)
是真的。
或者你可以使用strstr
在 的另一个字符串中找到一个字符串:
ststsr ("banana", "an")
将返回指向字符串an
中第一次出现banana
的指针(本例中为第二个字符),如果不存在则返回NULL。
所以,你的比较函数就像(只取消你感兴趣的那个):
int cmpDescricaoProduto (PLISTAPRODUTOS p, char* nome) {
// return strcmp (p->Descricao, nome) == 0; // for exact match
// return strncmp (p->Descricao, nome, 3) == 0; // for close (3-char) match
// return strstr (p->Descricao, nome) != NULL; // for "contains" match
}
可能也是您环境中可用的其他字符串比较函数,例如不区分大小写的函数,但它们在技术上不属于ISO C标准。