黑马程序员技术交流社区
标题:
想法多 路子野 喜欢跟老师作对 C语言对人名数据模糊匹配
[打印本页]
作者:
一曲繁华尽
时间:
2015-11-26 18:51
标题:
想法多 路子野 喜欢跟老师作对 C语言对人名数据模糊匹配
如意大师在讲C语言最后一个通讯录做搜索功能时说C做不了模糊匹配,其实他想说的是不好做,没有一个写好的函数。
但是其实做起来也不难 我就是喜欢反复造轮子
不多说上代码
这个匹配规则是 按照顺序只要有对应的字符就可以
也就是说 想要找你输入一个z那么所有名字中包含z的都会出现 输入zx那么所有包含z x 且有z在x之前的都会出现 ,也符合一般的使用需求
我这段是随便做了个数组来存字符 实际写起来用结构体链表是一样的 比对起来还更方便 不好写就不写了
//打开文件
FILE *fp;
char ch = '+';
fp = fopen("mohu.txt","r");
unsigned long int InputLong = 0;
char Input[20]={'+'};
//提示用户输入字符
printf("请输入要查询的字符:\n");
scanf("%s",Input);
//匹配字符
InputLong = strlen(Input);
//printf("%ld+1",InputLong);
ch =fgetc(fp);
int i =0,j=0;
char name[20][20]={0};
while(ch!=EOF){
if(ch==';'){
i++;
j=0;
}
else{
name[i][j]=ch;
j++;
}
ch =fgetc(fp);
}
//遍历全部人名
printf("数据库中有:");
for(int x=0;x<i+1;x++){
for(j= 0;j<20;j++){
printf("%C",name[x][j]);}
printf("\t");
}
printf("\n 你要找的有:");
//循环将输入的字符和数据库中的字符逐个对比符合要求则输出
for(int x =0;x<i+1;x++){
int y =0;
int z =0;
int result =0;
for(int j =0;j<strlen(name[x]);j++){
char str1 = Input[y];
char str2 = name[x][z];
int num1 = str1;
int num2 =str2;
// printf("比较 %c与 %c\t,strcmp 结果为 %d", str1,str2,strcmp(&str1,&str2));
if((num1-num2) == 0){
result = result +1;
y++;
z++;
}else{
z++;
}
}
if(result == InputLong){
printf("\n%s", name[x]);
}
}
printf("\n");
fclose(fp);
//
return 0;
}
复制代码
屏幕快照 2015-11-26 18.41.38.png
(70.72 KB, 下载次数: 0)
下载附件
2015-11-26 18:42 上传
作者:
一曲繁华尽
时间:
2015-11-26 18:53
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
复制代码
代码没复制全...
作者:
一曲繁华尽
时间:
2015-11-26 18:55
另外说一点 strcmp并不好用 至少这里不好用 没法比较两个字符变量或者字符指针的大小
所以直接转换为ascii更方便
作者:
一曲繁华尽
时间:
2015-11-27 14:48
赚点黑马币果然挺难的= =
作者:
一曲繁华尽
时间:
2015-11-29 19:23
没人理 ,那我写几个视频没有讲到的知识点 看到有看不到无
strlen函数遇到\0则停止 所以假如你的字符数组从第二位开始存储字符 那么strlen是没法工作的
作者:
令狐冲
时间:
2015-11-29 19:30
找bug哈哈哈
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2