英语单词匹配函数

可以先看看我的字符串匹配文章:

字符串替换C语言长度不定

接下来是单词匹配的函数

在做POJ1598 我写的1598:POJ-1598 C语言

的时候 需要检验完整的单词

即 匹配串是一个单词 在主串里也必须是一个单词

如 主串 I am a man,you are a superwoman.

    次串1   woman        次串2  superwoman

则 主串中是不含有次串1的 含有次串2

先展示一个单匹配的:

# include <stdio.h>
# define At(t)  (t<'a'||t>'z')&&(t<'A'||t>'Z')
int CMP(char a,char b){//如果忽略大小写则三个 否则,只保留 a==b即可
   return  a==b+32||b==a+32||a==b;
}
int BF(char a[],char b[]){//a中如果有b这个单词返回1 否则返回0
    int i=0,j=0;
    do{
        if (b[j]&&CMP(a[i++],b[j]))++j;//若a[i]与b[j]相等或是大小写关系 继续比较
        else{
           if(!b[j]){//如果b字符串到头了 此时需要检查 b在a字符串是否为完整的单词
            if((i!=j)&&At(a[i-j-1])||(i==j))//i==j时 b在a字符串的串首  如果不在串首,则i!=j 此时应检查a[i-j-1]
            if(!a[i]||a[i]&&At(a[i]))//如果b在a字符串的串尾 则a[i]==0  如果不在末尾 则检验 a[i]
            return 1;//此时b在a里是个完整的单词 返回1
           }
           else i-=j;
            j=0;
        }
    }while(a[i-1]);
        return 0;//检查完没有返回0
}
 int main(){
       char A[]={"I have a superdog,My god!"},B[]={"dog"},C[]={"superdog"};
       printf("A里有B这个完整的单词 %s\n",BF(A,B)?"YES":"NO");
       printf("A里有C这个完整的单词 %s\n",BF(A,C)?"YES":"NO");
      return 0;
}
全匹配的代码:

# include <stdio.h>
# define N 101
# define At(t)  (t<'a'||t>'z')&&(t<'A'||t>'Z')
int CMP(char a,char b){
   return  a==b+32||b==a+32||a==b;
}
void BF(char a[],char b[],int c[]){//匹配 a中b单词完整的个数  c[0]存储匹配的个数 c[1],c[2]……存储匹配的单词的 下标 使用方法和群里的 字符串匹配下标相同
    int i=0,j=0,k=0;
    do{
        if (b[j]&&CMP(a[i++],b[j]))++j;//若a[i]与b[j]相等或是大小写关系 继续比较
        else{
           if(!b[j]){//如果b字符串到头了 此时需要检查 b在a字符串是否为完整的单词
            if((i!=j)&&At(a[i-j-1])||(i==j))//i==j时 b在a字符串的串首  如果不在串首,则i!=j 此时应检查a[i-j-1]
            if(!a[i]||a[i]&&At(a[i]))//如果b在a字符串的串尾 则a[i]==0  如果不在末尾 则检验 a[i]
            c[++k]=i-j;//存储当前匹配的单词位置
           }
           else i-=j;
            j=0;
        }
    }while(a[i-1]);
        c[0]=k;
}
int main(){
   char A[N]={"HOMEWORK:I am doing my homework.your homework!Homework?oh"},B[N]={"Homework"};
   int C[N],i;
   BF(A,B,C);
   printf("B字符串在A中个共 %d个 <忽略大小写>\n匹配的数组下标:\n",C[0]);
   if(C[0])
   for(i=1;i<=C[0];i++)
     printf("%d ",C[i]);
    printf("\n");
   return 0;
}



 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值