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

这是一个关于字符串匹配的问题,但是有问题,求教 谢谢

一条沙丁鱼 发布于 2015-04-05 20:37, 974 次点击
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const n=100;
const m=50;

int stringmatch(char ch1[],char ch2[])
{
    int i,j;
    for(i=0;i<n-m;)
    {
        j=0;
        while(j<m&&ch2[j]==ch1[i+j])
        {
            j=j+1;
            if(j=m)
                return i;
        }
    return 0;
    }
}

void main()
{
    int k;
    char c1[n];
    char c2[m];
    cout<<"请输入第一串字符:"<<endl;
    cin.getline(c1,n-1);
    cout<<"第一串字符为:"<<c1<<endl;
    cout<<"请输入第二串字符:"<<endl;
    cin.getline(c2,m-1);
    cout<<"第二串字符为:"<<c2<<endl;
    k=stringmatch(c1,c2);
    if(k==-1)
        cout<<"匹配失败!"<<endl;
    else
        cout<<k<<endl;
}

[ 本帖最后由 一条沙丁鱼 于 2015-4-5 20:47 编辑 ]
14 回复
#2
一条沙丁鱼2015-04-05 20:48
求大神们帮忙看看,我新手上路,明天就要交作业,自己觉得没问题,可是运行的时候达不到想要的结果。
#3
一条沙丁鱼2015-04-05 21:17
求大神帮忙,我这个只能比较出如果第一个字符相同的情况,没法比较出不同的两个字符串和第一个字符不相同的情况
#4
wmf20142015-04-05 22:27
if(j=m)//该语句明显错误
你main里是判断-1为匹配失败的,但stringmatch函数里无-1返回
#5
一条沙丁鱼2015-04-06 09:01
回复 4楼 wmf2014
后来发现那里有问题了,但是改了之后还是有问题。
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
const n=100;
const m=50;

int stringmatch(char ch1[],char ch2[])
{
    int i,j;
    for(i=0;i<=n-m;i++)
    {
        for(j=0;;)
        {
            if(j<m)
            {
                if(ch2[j]==ch1[i+j])
                    j=j+1;
                else
                    break;
            }
            if(j==(m+1))
                return 1;
        }
    }
    return 0;
}

void main()
{
    int k,i;
    char c1[n];
    char c2[m];
    cout<<"请输入第一串字符:"<<endl;
    cin.getline(c1,n-1);
    cout<<"第一串字符为:"<<c1<<endl;
    cout<<"请输入第二串字符:"<<endl;
    cin.getline(c2,m-1);
    cout<<"第二串字符为:"<<c2<<endl;
    k=stringmatch(c1,c2);
    if(k==0)
        cout<<"匹配失败"<<endl;
    else
        cout<<"匹配成功"<<endl;
}
这样子不论输入的是否可以匹配,均显示匹配失败,求大神再费神看看。
#6
诸葛欧阳2015-04-06 11:35
什么是匹配?不过看起来应该不复杂仔细改能改出来
#7
一条沙丁鱼2015-04-06 11:54
回复 6楼 诸葛欧阳
意思就是想通过这段代码完成类似这样的操作,比如输入的第一组字符串为:wearertheyouth。如果第二组字符串为are,则在第一组中可以找到,故为匹配成功,如果输入的第二组字符串为sun,在第一组中找不到,则为匹配失败。就这样。编译没问题,但是不论我输入的第二组字符串为are还是sun,都输出的是匹配失败。所以帮忙看看,问题出在哪了,感激不尽。
#8
wmf20142015-04-06 12:08
不知道我的理解是否有错:所谓匹配就是指字符串完全相同。
如果是这样,你有几个错误:
1、字符串有自己的格式,通过判断'\0'判断字符串是否结束,完全不需要判断整个字符串的长度,无需n、m常量
2、即使判断整个数组,也是判断长度最短的那个数组,不知道你为什么会是0至n-m,只不过你n-m=m所以可能侥幸让你的代码通过。
3、无需使用循环嵌套,一个循环即可。
修改后函数部分代码如下,替换原函数即可:
int stringmatch(char ch1[],char ch2[])
{
    int i,j;
    for(i=0,j=0;!j&&ch1[i]&&ch2[i];i++)j=j+ch1[i]^ch2[i];
    j=j+ch1[i]^ch2[i];//再做一次字符串结尾的运算,防止前面相同但ch2长度大于ch1
    if(j)j=1;//
    return !j;
}
#9
一条沙丁鱼2015-04-06 22:46
回复 8楼 wmf2014
首先,字符串匹配的两个字符不一定都一样,第二串字符在第一串字符中可以找到就是匹配成功,你改成的那段函数我尝试了一下是两个字符串完全相同时便是匹配成功,所以只比较第一串字符串的第i个位置指向的字符是否和第二串一样。我想完成的是蛮力法字符串匹配,就是说第一个字符串是文本,第二个字符串是模板,在第一组字符串中找是否有第二组字符串,比如第一组字符串为:wearetheyouth;第二串字符串为:ear;这样的情况下也是可以的,所以我第一个for循环只用循环到n-m就可以(n为第一组字符串的长度,m为第二组字符串的长度,如果i小于n-m,就不用比较了)。不知道这样说可不可以明白,如果在这样的情况下,大神可以再帮忙看看吗?究竟是哪里出了问题?
#10
一条沙丁鱼2015-04-06 22:48
回复 8楼 wmf2014
另外,很抱歉我是初学者,自己看的c++的书,不太明白j=j+ch1[i]^ch2[i];这一语句的意思,还望指教
#11
wmf20142015-04-06 23:52
哦,这样啊,那是要两个循环,代码如下:
int stringmatch(char ch1[],char ch2[])
{
    int i,j,l;
    for(l=0;ch2[l]!=0;l++);//获取被比较字符串长度
    for(i=0;ch1[i]!=0;i++)
    {
        for(j=0;ch1[i+j]==ch2[j]&&ch2[j]!=0;j++);
        if(j==l)return 1;
    }
    return 0;
}
#12
yangfrancis2015-04-07 13:03
int stringmatch(char ch1[],char ch2[])
{
    if(strlen(ch1)<strlen(ch2))
        return 0;
    int idx_1,idx_2,sum;
    for(idx_1=0;idx_1<strlen(ch1)-strlen(ch2)+1;idx_1++)
    {
        sum=0;
        for(idx_2=0;idx_2<strlen(ch2);idx_2++)
        {
            if(ch1[idx_1+idx_2]==ch2[idx_2])
                sum++;
        }
        if(sum==strlen(ch2))
            return idx_1+1;
    }
    return 0;
}
可以这样写
#13
一条沙丁鱼2015-04-07 18:55
回复 11楼 wmf2014
大神,我照你改的调试运行了一下,第一次的时候我输入的是wearetheyouth,和ear,显示匹配成功,但是之后换别的字符串进行运行都显示失败,我上传了照片,麻烦了再帮忙看看,谢谢!
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
#14
一条沙丁鱼2015-04-07 20:31
回复 11楼 wmf2014
可以了,谢谢大神,没有问题了
#15
一条沙丁鱼2015-04-07 21:18
回复 12楼 yangfrancis
恩恩,后期调试的时候发现了,需要确定第二个字符串的长度问题,之前没有想到用strlen这个函数,多谢!
1