| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 557 人关注过本帖
标题:C++练习
只看楼主 加入收藏
keep_on
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-10-31
收藏
 问题点数:0 回复次数:6 
C++练习
/*1. 根据课件上的String类进一步完成以下运算符重载函数的定义,并编写主函数测试。
(1) friend String operator+(String &, char *);
(2) friend String operator-(String & str1, char * str2);
(3) friend String operator-(String & str1, String & str2);
*/
#include<iostream.h>
#include<string.h>

class String
{
    private:
        char *buf;
        int  length;
        int Index(String &,String &);
        int Index(String &,char *);
    public:
        String(char *s="good!")
        {
            length=strlen(s);
            buf=new char[length+1];
            strcpy(buf,s);
        }
        String(String &s)
        {
            length=s.length;
            buf=new char[length+1];
            strcpy(buf,s.buf);
        }
        ~String()
        {
            delete []buf;
        }
        String & operator=(const String & str)
        {
            if(buf)
                delete buf;
            length=str.length;
            buf=new char[str.length+1];
            strcpy(buf,str.buf);
            return *this;
        }
        char * isIn(const char ch)//在字符串中查找某个字符
        {
            char *cp=buf;
            while(*cp)
            {
                if(*cp==ch)
                    return cp;
                cp++;
            }
            return 0;
        }
        
        int isSubStr(const char *str)
        {
            if(strstr(buf,str))
                return 1;
            return 0;
        }
        int operator <(const char *str)
        {
            if( strcmp(buf, str)<0)
                return 1;
            return 0;
        }
        int operator >(const char *str)
        {
            if( strcmp(buf, str)>0)
                return 1;
            return 0;
        }
        int operator ==(const char *str)
        {
            if( strcmp(buf, str)==0)
                return 1;
            return 0;
        }
        void Print()
        {
            cout<<buf<<endl;
        }
        friend String operator +(const String & ,const String & );
        friend String operator+(String &, char *);   
        friend String operator-(String & , char * );        
        friend String operator-(String & , String & );        
};
int String::Index(String &s,String &t)
{
    int i=0,j=0;
    while (i<s.length && j<t.length)
    {
        if (s.buf[i]==t.buf[j])
        {
            i++;
            j++;
        }
        else
        {
            i=i-j+1;
            j=0;
        }
    }
    if (j>t.length)
        return i-t.length+1;
    else
        return 0;
}
int String::Index(String &s,char *t)
{
    int i=0,j=0;
    while (i<s.length && j<strlen(t))
    {
        if (s.buf[i]==t[j])
        {
            i++;
            j++;
        }
        else
        {
            i=i-j+1;
            j=0;
        }
    }
    if (j>strlen(t))
        return i-strlen(t)+1;
    else
        return 0;
}
String operator +(const String & str1,const String & str2)
{
    String temp;
    temp.length=str1.length+str2.length;
    temp.buf=new char[temp.length+1];
    strcpy(temp.buf,str1.buf);
    strcat(temp.buf,str2.buf);
    return temp;
}
String operator+(String &str1, char *str2)
{
    String temp;
    temp.length=str1.length+strlen(str2);
    temp.buf=new char[temp.length+1];
    strcpy(temp.buf,str1.buf);
    strcat(temp.buf,str2);
    return temp;
}
String operator-(String & str1, char * str2)
{
    String temp;
    char *p=str1.buf;
    temp.length=str1.length-strlen(str2);
    temp.buf=new char[temp.length+1];
    for (int i=0;i<Index(str1,str2);i++)
        temp.buf[i]=str1.buf[i];
    p+=strlen(str2);
    while((temp.buf[i++]=*p++)!=0);
    return temp;
}
String operator-(String & str1, String & str2)
{
    String temp;
    char *p=str1.buf;
    temp.length=str1.length-str2.length;
    temp.buf=new char[temp.length+1];
    for (int i=0;i<Index(str1,str2);i++)
        temp.buf[i]=str1.buf[i];
    p+=str2.length;
    while((temp.buf[i++]=*p++)!=0);
    return temp;
}
void main()
{
  String str1,str2("Hello,"),str3("everyone!");
  cout<<str2.isSubStr("lo")<<endl;
  if(str2>"Ha") cout<<"true"<<endl;
  str1=str2+str3;
  str1.Print();
  
  char *sp1="el";
  if(str1.isSubStr(sp1))
      str2=str1-sp1;
  str2.Print();
}

请大家帮忙看看这个问题,哪里错了呢?不知道怎样改。谢谢!
搜索更多相关主题的帖子: 测试 private include public 
2012-12-01 22:06
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
好熟悉的题,楼主也是 杨勇 的学生?


[fly]存在即是合理[/fly]
2012-12-01 22:20
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
String operator-(String & str1, char * str2)
{
    String temp;
    char *p=str1.buf;
    temp.length=str1.length-strlen(str2);
    temp.buf=new char[temp.length+1];
    for (int i = 0;i <= temp.Index(str1,str2);i++)
    //index是类内函数,要通过类名访问。
        temp.buf[i]=str1.buf[i];
    p+=strlen(str2) + i;    //这个指针要指到str1.buf[i+strlen(str2)]
    while((temp.buf[i++]=*p++)!=0);
    return temp;
}


[fly]存在即是合理[/fly]
2012-12-01 22:48
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
这个是我写的:
程序代码:
String operator-(String & str1, char * str2)
{
    if (!strstr(str1.buf, str2))  return str1;
    String temp;
    temp.length = str1.length - strlen(str2);
    temp.buf = new char[temp.length + 1];
    for (int i = 0;str1.buf[i] != *strstr(str1.buf, str2);i++);
    strncpy(temp.buf, str1.buf, i);
    temp.buf[i] = '\0';
    strcat(temp.buf, str1.buf + i + strlen(str2));
    return temp;
}


[fly]存在即是合理[/fly]
2012-12-01 22:53
keep_on
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-10-31
收藏
得分:0 
回复 2楼 azzbcc
是的
2012-12-02 09:23
keep_on
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2012-10-31
收藏
得分:0 
回复 3楼 azzbcc
谢谢,我知道怎么改了!
2012-12-02 11:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
先换老师,换课件
错误的东西,会令人越学越废
2012-12-03 09:13
快速回复:C++练习
数据加载中...
 
   



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

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