注册 登录
编程论坛 C++教室

关于字符串子串查找程序,有问题,求高手指点

shengshm1989 发布于 2013-09-09 22:26, 700 次点击
问题描述:  
判断一个字符串(dst)是否是另一个字符串(src)的子串;  
输出子串在母串中的第一次出现的起始位置;  
匹配的时候不区分大小写;  
不能使用库函数(使用库函数按0分计算);  
要求实现函数:  
unsigned int str_str(char * src, char *dst);
返回:如果dst是src的子串 则返回起始位置       如果不是 则返回0
输入:src 指向母串的指针; dst 指向子串的指针
示例  
src->akrsd5859  dst->rsd
则返回3
src->Rstsawerst36ds  dst->rst
则返回8
src->dfsge         dst-> dfsgesa
则返回0
程序代码:
#include<iostream>
//#include<assert>
using namespace std;

 int result=0;
unsigned int str_str(char *src,char *dst)//判断一个字符串是否是另一个字符串的子串,输出子串在母串中第一次出现的位置
{char *pa=src;                                //匹配时不区分大小写
char *pb=dst;

 int M=strlen(src);

 int N=strlen(dst);

 int count=0;

 for(int i=0;i<M;i++)

 {  if(*pb==' ')
   {count=i+2-N;
    return count;
    break;
    }
     if(*pa==*pb||*pa==*pb+32||*pa==*pb-32)
     {pa++;
      pb++;
     }
    else{pa++;
        pb=dst;
        }
  }
}

//主函数
int main()
{char src[]="akrsd5859";

 char dst[]="rsd";

 result=str_str(src,dst);

 cout<<"result="<<result<<endl;
}

这是我写的代码,可是结果根本不对,想问问大家程序哪里出了问题
8 回复
#2
pauljames2013-09-10 07:33
《数据结构基础C语言版》里面提到了字符串匹配算法;就算不使用库函数,你也可以找一下他的实现方法的。
#3
yuccn2013-09-10 08:19
为什么要自己写一个?函数库中有的,strstr 或者 strnstr 等一套函数。
而且  if(*pa==*pb||*pa==*pb+32||*pa==*pb-32) 这样不对吧,不要限制一下范围?A 编码好像是65吧,那么 编码为33的 字符,被认为和A一样啦?
#4
shengshm19892013-09-10 09:13
回复 2楼 pauljames
恩恩,数据结构我还没学过,正在学,谢谢啊
#5
shengshm19892013-09-10 09:15
回复 3楼 yuccn
恩恩,提出了宝贵意见啊,可是核心是里面的匹配不对,结果让人摸不着头脑
#6
zhulincao2013-09-10 11:13
程序代码:
if(*pb==' ')
   {count=i+2-N;
    return count;
    break;
    }

这一段代码判断字符串是否结束有问题,并且
if(*pa==*pb||*pa==*pb+32||*pa==*pb-32)
     {pa++;
      pb++;
     }

这一段也有问题(因为字符串中不一定全是字母,加减32是错误的。),自己再好好看看。
#7
未未来2013-09-10 18:39
我不知道你为什么不要用标准库函数,但是我觉得用string的话比较好写一些
我没看你的代码,
这是我写的,你测试一下,
程序代码:
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
unsigned int str_str(char * src, char *dst)
{
    size_t m=strlen(src);
    size_t n=strlen(dst);
    string  s1(src,src+m);
    string s2(dst,dst+n);
    if(n>m) return 0;
    else if(n<=m){  typedef string::iterator iter;
    iter begit=s1.begin();
    iter endit=s1.begin()+n;
      int counts=0;
        while(endit+counts!=s1.end()){
            string x(begit+counts,endit+counts);
            if(x==s2){return (counts+1);
            }
            else{
                ++counts;
            }


        }


    }
else {return 0;}

}
int main()
{char src[]="akrsd5859";
char dst[]="rsd";
unsigned int result;
result=str_str(src,dst);
cout<<"result="<<result<<endl;

return 0;
}
#8
shengshm19892013-09-10 23:00
回复 6楼 zhulincao
恩恩,这段确实有问题,谢谢提醒啊
#9
shengshm19892013-09-10 23:07
回复 7楼 未未来
您的程序可以运行,谢谢参考啊,学习了
1