A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

如意大师在讲C语言最后一个通讯录做搜索功能时说C做不了模糊匹配,其实他想说的是不好做,没有一个写好的函数。
但是其实做起来也不难  我就是喜欢反复造轮子
不多说上代码
这个匹配规则是 按照顺序只要有对应的字符就可以  
也就是说 想要找你输入一个z那么所有名字中包含z的都会出现 输入zx那么所有包含z x 且有z在x之前的都会出现 ,也符合一般的使用需求  
我这段是随便做了个数组来存字符 实际写起来用结构体链表是一样的  比对起来还更方便 不好写就不写了

  1.     //打开文件
  2.     FILE *fp;
  3.     char ch = '+';
  4.     fp = fopen("mohu.txt","r");
  5.     unsigned long int InputLong = 0;
  6.     char Input[20]={'+'};
  7.     //提示用户输入字符
  8.     printf("请输入要查询的字符:\n");
  9.     scanf("%s",Input);
  10. //匹配字符
  11.    
  12.     InputLong = strlen(Input);
  13.     //printf("%ld+1",InputLong);

  14.    ch =fgetc(fp);
  15.     int i =0,j=0;
  16.   
  17.     char name[20][20]={0};
  18.    
  19.     while(ch!=EOF){
  20.         if(ch==';'){
  21.             i++;
  22.             j=0;
  23.         }
  24.         else{
  25.             name[i][j]=ch;
  26.               j++;
  27.         }
  28.    
  29.       
  30.    
  31.     ch =fgetc(fp);
  32.      
  33.    
  34.     }
  35.    
  36.     //遍历全部人名
  37.     printf("数据库中有:");
  38.     for(int x=0;x<i+1;x++){
  39.         
  40.         for(j= 0;j<20;j++){
  41.             printf("%C",name[x][j]);}
  42.         printf("\t");
  43.     }
  44.     printf("\n 你要找的有:");
  45.     //循环将输入的字符和数据库中的字符逐个对比符合要求则输出
  46.     for(int x =0;x<i+1;x++){
  47.         int y =0;
  48.         int z =0;
  49.         int result =0;
  50.    
  51.         for(int j =0;j<strlen(name[x]);j++){
  52.         
  53.             char str1 = Input[y];
  54.             char str2 = name[x][z];
  55.             int num1 = str1;
  56.             int num2 =str2;
  57.        //     printf("比较 %c与 %c\t,strcmp 结果为 %d", str1,str2,strcmp(&str1,&str2));

  58.             if((num1-num2) == 0){
  59.                 result = result +1;
  60.                 y++;
  61.                 z++;
  62.             }else{
  63.                 z++;
  64.             }
  65.         
  66.         }
  67.    
  68.         if(result == InputLong){
  69.             printf("\n%s", name[x]);
  70.         
  71.         }
  72.    
  73.     }
  74.     printf("\n");
  75.    fclose(fp);
  76. //   

  77.         return 0;
  78. }
复制代码

屏幕快照 2015-11-26 18.41.38.png (70.72 KB, 下载次数: 0)

屏幕快照 2015-11-26 18.41.38.png

5 个回复

正序浏览
令狐冲 来自手机 中级黑马 2015-11-29 19:30:19
地板
找bug哈哈哈
回复 使用道具 举报
没人理 ,那我写几个视频没有讲到的知识点 看到有看不到无
strlen函数遇到\0则停止 所以假如你的字符数组从第二位开始存储字符 那么strlen是没法工作的
回复 使用道具 举报
赚点黑马币果然挺难的= =
回复 使用道具 举报
另外说一点  strcmp并不好用 至少这里不好用  没法比较两个字符变量或者字符指针的大小
所以直接转换为ascii更方便
回复 使用道具 举报

  1. #include <stdio.h>
  2. #include <string.h>



  3. int main(int argc, const char * argv[]) {
复制代码

代码没复制全...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马