| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1137 人关注过本帖
标题:我想问一下,这个程序应该怎么改才可以得到正确的答案?弄不明白,请各位高 ...
只看楼主 加入收藏
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
结帖率:78.26%
收藏
已结贴  问题点数:10 回复次数:26 
我想问一下,这个程序应该怎么改才可以得到正确的答案?弄不明白,请各位高手看一看。
#include"iostream"
#define Max 256
using namespace std;
typedef struct
{
    char ch[Max];
    int lenght;
}
SeqString;
void InitString(SeqString *s)
{
    char ch;
    int i=0;
    while((ch=getchar())!='\n'&&i<Max)
        s->ch[i++]=ch;
    s->lenght=i;
}
int Strlen(SeqString *s)
{
    return (s->lenght);
}
SeqString *substr(SeqString *s,int pos,int len,SeqString *sub)
{
    int i;
    if(pos<1||pos>s->lenght||len<1||len>s->lenght)
    {
        cout<<"error!!"<<endl;
    return NULL;
    }
    for(i=0;i<len;i++)
        sub->ch[i]=s->ch[pos+i-1];
    sub->lenght=len;
    return (sub);
}
int strcmp(SeqString *s,SeqString *t)
{
    int i,j;
    for(i=1,j=1;i<s->lenght,j<t->lenght;)
        {
            if(s->ch[i]==t->ch[j])
            {
                i++;
                j++;
            }
            else
            {
                i=i-j+2;
                j=1;
            }
        }
        if(j>t->lenght)
            return (i-t->lenght+1);   
        else
            return 0;
   
}
void main()
{
    int i,k;
    SeqString *s,*t,*r;
    cout<<"构造一个串s!!"<<endl;
    InitString(s);
    cout<<"构造一个串t!!"<<endl;
    InitString(t);
    cout<<"请输入子串在主串中位置:";
    cin>>i;
    k=strcmp(substr(s,i,Strlen(t),r),t);
    cout<<k;
}
编译时出现这样的警告:
C:\VC++6.0简体中文版 编程工具\cv++6.0\MSDev98\MyProjects\program46\2011.4.29.cpp(62) : warning C4700: local variable 's' used without having been initialized
C:\VC++6.0简体中文版 编程工具\cv++6.0\MSDev98\MyProjects\program46\2011.4.29.cpp(64) : warning C4700: local variable 't' used without having been initialized
C:\VC++6.0简体中文版 编程工具\cv++6.0\MSDev98\MyProjects\program46\2011.4.29.cpp(67) : warning C4700: local variable 'r' used without having been initialized

2011.4.29.obj - 0 error(s), 3 warning(s)
帮忙看一下,谢谢啦。
搜索更多相关主题的帖子: return 答案 
2011-04-29 09:09
配角
Rank: 1
来 自:浙江
等 级:新手上路
帖 子:12
专家分:6
注 册:2010-11-4
收藏
得分:3 
是不是没有初始化 s,t,r
2011-04-29 09:30
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:3 
main 函数里改成
SeqString s, t, r;
然后调用的时候用
InitString(&s)
看看行不行。
2011-04-29 09:42
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 2楼 配角
嗯,换了就可以了。但还是得不到正确的答案,检查函数,也没觉得哪里错,可是结果总是得到个0,不懂为什么
2011-04-29 11:49
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 2楼 配角
嗯,换了就可以了。但还是得不到正确的答案,检查函数,也没觉得哪里错,可是结果总是得到个0,不懂为什么
2011-04-29 11:50
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
你那个 strcmp 是干什么的?用的算法这么奇怪,i j 又加又减的。
2011-04-29 12:15
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
回复 6楼 pangding
就是比较两个字符串的大小。
    for(i=1,j=1;i<=s->lenght,j<=t->lenght;)
        {
            if(s->ch[i-1]==t->ch[j-1])
            {
                i++;
                j++;
            }
            else
            {
                i=i-j+2;
                j=1;
            }
        }
串S和串T的字符一个一个比较,要是对应位置上的字符相同,指针i和指针j就向后移动,继续比较下一个字符。要是不相等,i就要回溯,需要从子串的第一个字符重新比较。
2011-04-29 12:42
棉雨
Rank: 5Rank: 5
等 级:职业侠客
帖 子:174
专家分:368
注 册:2011-4-22
收藏
得分:0 
以下是引用棉雨在2011-4-29 12:42:49的发言:

就是比较两个字符串的大小。
    for(i=1,j=1;i<=s->lenght,j<=t->lenght;)
        {
            if(s->ch==t->ch[j-1])
            {
                i++;
                j++;
            }
            else
            {
                i=i-j+2;
                j=1;
            }
        }
串S和串T的字符一个一个比较,要是对应位置上的字符相同,指针i和指针j就向后移动,继续比较下一个字符。要是不相等,i就要回溯,然后子串像右移动一个字符
,再从字串的第一个字符跟主串相比较。
2011-04-29 12:57
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
就是说只要 t 和 s 的一个子串一样就认为是一样的?

我感觉错的地方挺多的呀。
比如 for 里的终止条件是不是应该是 i<=s->lenght && j<=t->lenght
你应该也知道逗号表达式只有最后一个有意义吧。

还有就是那个 < <= 的问题,不过好像自己经注意到了。

还有就是感觉你这个函数接口设计的不好,你最后返回的值,(如果有子串相等的话)是那个子串的起始位置吧?这个是从0开始计的吗?
而且本来库函数里有 strcmp,你重载到是没事,不过故意让它们做的是不相近的事情,这是一种很差的名字函数的习惯。这其实才是我 6楼 问你的意思。

2011-04-29 17:15
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
这种东西自己跟踪一会就能发现。调试起来难度不是很大的,自己动手丰衣足食嘛~
2011-04-29 17:17
快速回复:我想问一下,这个程序应该怎么改才可以得到正确的答案?弄不明白,请各 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015844 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved