回 帖 发 新 帖 刷新版面

主题:来个高手!帮忙看下这个程序的问题出在那了

题目是这样的:输入两个字符串,求出第二个字符串是从第一个字符串的倒数第几个开始
如:字符串一是:"abcdef" 字符串二是"de",那么程序就是倒数第3个,如果没有在第一个字符串中找到第二个字符串,那么就输出-1;前提是不用string头文件;
下面是小弟的代码,代码完成了题目的要求,但是有一个问题
就是当你第一个字符串输入两个相同的字符串并且字符串长度大于3时,不论第二个字符串是什么,都会输出-1
如 字符串一是"abcabccba" 字符串二是"cba"那么就会输出-1 ;我想了半晚上没想出为什么 那位大侠帮忙解决下

#include <iostream>
using namespace std;
int fun(char *ps,char *pt)
{
    int len_ps=0;
    int len_pt=0;
    int sum=0;
    int count;
    while(*ps)
        {
            ps++;
            len_ps++;
        }
    while(*pt)
        {
            pt++;
            len_pt++;
    } 
    ps=ps-len_ps;
    pt=pt-len_pt;
    for (int i=0;i<len_ps;i++)
    {
        for (int j=0;j<len_pt;j++)
        {
            if (ps[i+j]==pt[j])
            {
                sum++;
                count=i;
            }
            else
                break ;
        }
    }
    if (sum==len_pt)
    {
        return len_ps-count;
    }
    else
            return -1;
}
int main()
{
    char *psc=new char[100];
    char *ptc=new char[100];
    cout<<"请输入一个字符串:"<<endl;
    cin>>psc;
    cout<<"请输入要查询的字符串:"<<endl;
    cin>>ptc;
    int pf;
    pf=fun(psc,ptc);
    if (pf!=-1)
    {
        cout<<"你所查询的字符串位于倒数第"<<pf<<"个!!!"<<endl;
    }
    else
        cout<<pf<<endl;
    return 0;
}

回复列表 (共3个回复)

沙发

我只改了这个地方

[code=c]
for (int i=0;i<len_ps;i++)
{
        sum = 0;              //每次都得清零
        for (int j=0;j<len_pt;j++)
        {
            if (ps[i+j]==pt[j])
            {
                sum++;
                count=i;
            }
            else
                break ;
        }
        if (sum==len_pt) //在循环内判断,否则即使满足sum == len_pt,往后也会被覆盖
        {
            return len_ps-count;
        }
        return -1;
}
[/code]
再说下我对这题的看法吧,我觉得这么写稍显麻烦,而且有个弊端,就是如果有重复的子串怎么办?可以这样吧:在得到ptc的长度后,从psc首字符开始,以ptc的长度为尺寸,截得这么一个串p_cut,这样依次strcmp个人感觉还要好点。。而且很容易得到字串在父串各个地方出现的位置。。

板凳

谢谢这位 这个程序就是不想调用string类库 所以当然麻烦了 不过问题解决了

3 楼


你可以自己写个函数额。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册