如意大师在讲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;
- }
复制代码 |
|