字符串类设计与应用

题目描述

模拟标准库字符串类实现你自己的字符串类。该类需具有构造、字符串连接+、取子串和复制构造、移动构造、复制赋值、移动赋值、输出等功能。要求使用动态分配存储字符串内容。

输入描述

测试程序有4个字符串,每个样例前两行含长度不超过200的俩字符串,赋值给前2个字符串对象,后面若干指令,每个指令占一行,分别由指令码和所需参数组成,空格分隔,每个指令码具有不同参数和意义; 指令有下述几种 : 指令P i代表输出字符串i; 指令A i j代表字符串i赋值给字符串j; 指令C i j k 代表将字符串i和字符串j连接后赋值给字符串k; 指令F i s l k代表从字符串i位置s开始的长度为l的子串赋值给字符串k;所有操作指令和参数肯定是有校的。

输出描述

每个字符串输出占1行

样例输入

Hello
HDU
P 1
P 2
C 1 2 3
P 3
F 3 5 3 4
P 4

样例输出

Hello
HDU
HelloHDU
HDU网址:http://virlab.hdu.edu.cn/assignment/programList.jsp?proNum=1&courseID=4&assignID=55
题解:简单的语法练习题。可以自行扩展一下,比如说实现stl中string的所有操作,加深理解,由于时间原因只多加了个resize()。注意样例中只有3个操作,而题目要求了4个。

以下是代码:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define me(a,b) memset(a,b,sizeof(a))
#define N 101
typedef long long ll;
using namespace std;

class mystring
{
private:
      char*s;
      int l;
      int size;
public:
      //构造
      mystring()//普通构造
      {
            s=NULL;
            l=0;
            size=0;
      }
      mystring(char *a);
      mystring(mystring&a);
      mystring(mystring&&a);
      ~mystring()
      {
            delete s;
      }

      //运算符重载
      mystring&operator=(char*a);
      mystring&operator=(mystring&a);
      mystring&operator=(mystring&&a);
      friend mystring operator+(mystring&a,mystring&b);

      //功能
      void show();
      friend mystring sub(mystring&a,int s,int l);
      void resize(int n);//重新分配内存(当已申请的内存不够用时)

/*

*/
}s[4];

//构造
mystring::mystring(char*a)
{
      (*this)=a;//使用重载的=号构造
}
mystring::mystring(mystring&a)
{
      (*this)=a;//使用重载的=号构造
}
mystring::mystring(mystring&&a)
{
      (*this)=a;//使用重载的=号构造
}

//重载
mystring& mystring::operator=(char*a)
{
      l=strlen(a);
      size=l+10;
      s=new char[size];
      for(int i=0;i<l;i++)
            s[i]=a[i];
}
mystring& mystring::operator=(mystring&a)
{
      l=a.l;
      size=a.size;
      s=new char[size];
      for(int i=0;i<l;i++)
            s[i]=a.s[i];
}
mystring& mystring::operator=(mystring&&a)
{
      l=a.l;
      size=a.size;
      s=a.s;
      a.s=NULL;
}
mystring operator+(mystring&a,mystring&b)
{
      mystring tmp;
      tmp.l=a.l+b.l;
      tmp.size=tmp.l+10;
      tmp.s=new char[tmp.size];
      for(int i=0;i<a.l;i++)
      {
            tmp.s[i]=a.s[i];
      }
      for(int i=a.l;i<tmp.l;i++)
      {
            tmp.s[i]=b.s[i-a.l];
      }
      return tmp;
}

//操作
void mystring::show()
{
      for(int i=0;i<l;i++)
      {
            cout<<s[i];
      }
      cout<<endl;
}
void mystring::resize(int n)
{
      this->size=n;
      char *tmp=new char[n];
      for(int i=0;i<this->l;i++)
            tmp[i]=this->s[i];
      delete s;
      s=tmp;
      tmp=NULL;
}
mystring sub(mystring&a,int s,int l)
{
      mystring tmp;
      tmp.l=l;
      tmp.size=tmp.l+10;
      tmp.s=new char[tmp.size];
      for(int i=0;i<l;i++)
      {
            tmp.s[i]=a.s[i+s];
      }
      return tmp;
}

int main()
{
      //freopen("in.txt","r",stdin);
      char a[200],ch;
      int q,w,e,r;
      cin>>a;
      s[0]=a;
      cin>>a;
      s[1]=a;
      while(cin>>ch)
      {
            if(ch==‘P‘)
            {
                  cin>>q;
                  s[q-1].show();
            }
            else if(ch==‘C‘)
            {
                  cin>>q>>w>>e;
                  s[e-1]=s[q-1]+s[w-1];
            }
            else if(ch==‘A‘)
            {
                  cin>>q>>w;
                  s[w-1]=s[q-1];
            }
            else if(ch==‘F‘)
            {
                  cin>>q>>w>>e>>r;
                  s[r-1]=sub(s[q-1],w,e);
            }

      }
}

原文地址:https://www.cnblogs.com/zgncbsylm/p/10733465.html

时间: 2024-08-01 10:20:54

字符串类设计与应用的相关文章

设计一个字符串类String(C++练习题)

要求:设计一个字符串类String,可以求字符串长度,可以连接两个串(如,s1="计算机",s2="软件",s1与s2连接得到"计算机软件"),并且重载"="运算符进行字符串赋值,编写主程序实现:s1="计算机科学",s2="是发展最快的科学!",求s1和s2的串长,连接s1和s2 #include "stdafx.h" #include <iostream&g

第九周 程序阅读-字符串类的设计

阅读下面的程序,领会其中用到的设计方案.技术手段与算法. /* 对于要定义的字符串类CMyString, 数据成员包括: - 字符串的长度: - 指向字符串第一个字符的指针 成员函数包括: - 不带参数的构造函数: - 带一个类型为const char *类型的参数(用于对字符串初始化)的构造函数: - 带一个const CMyString&类型的复制构造参数: - 析构函数: - Strlen函数 (用于求字符串的长度): - int Find(char c) (找出字符c在本字符串中第一次出

为什么不用C++写游戏(这些工作,QT都替开发者解决了,C++没有根类导致太多的问题,也没有字符串类)

当今世界上绝大多数游戏都是C++写的,为什么要说不呢? 要做什么?写游戏. 写游戏首先要考虑些什么?做什么样的游戏,图形.音效.游戏逻辑如何实现. 用C++要先考虑什么?定义跨平台数据类型抽象,实现常用集合类,设计宏实现RTTI,写一个支持Unicode并可以和其他多种字符串类型互相转换的字符串类,自定义内存分配器,写个shared_ptr,组织预编译头文件,设计实现Object基类以处理跨DLL内存管理等问题…… 那么这些和做游戏有什么关系?不做好这些就很难开始写游戏. 做这些要话多少时间?很

第八周(字符串类)

/* *copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:第八周(字符串类) *作者:王忠 *完成日期:2015.4.29 *版本号:v1.0 * *问题描述:构造String类的加.减运算.其中,s1 + s2将两个字符串的连接起来:s1 - s2是将s1的尾部空格和s2的前导空格去除后的连接. 提示:有指针成员,设计时要注意. *输入描述: *程序输出: #include <iostream> #include <cstr

C++类设计过程中的原则(总结)

一.由编译器生成的成员函数 1)默认的构造函数 默认构造函数定义为没有参数,或者有默认的参数值.当用户自己未定义时,系统可以提供. 自动生成的默认构造函数,会调用继承的基类的默认构造函数来构造派生类的基类部分. 若Star是一个类,则 Star orig; Star array[6];都将需要默认构造函数. 如果自己定义了构造函数,则系统不会再生成默认构造函数,这个时候最好自己要定义一个默认构造函数. 构造函数 -- [确保对象的生成] -- 最好提供显式的默认构造函数,以确保对象能够正确的初始

Problem A: 字符串类(I)

Problem A: 字符串类(I) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6383  Solved: 3131[Submit][Status][Web Board] Description 封装一个字符串类,用于存储字符串和处理的相关功能,支持以下操作: 1. STR::STR()构造方法:创建一个空的字符串对象. 2. STR::STR(const char *)构造方法:创建一个字符串对象,串的内容由参数给出. 3. STR::len

Problem B: 字符串类(II)

Problem B: 字符串类(II) Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 6103  Solved: 2687[Submit][Status][Web Board] Description 封装一个字符串类,用于存储字符串和处理的相关功能,支持以下操作: 1. STR::STR()构造方法:创建一个空的字符串对象. 2. STR::STR(const char *)构造方法:创建一个字符串对象,串的内容由参数给出. 3. STR::le

为什么jdk中把String类设计成final

为什么jdk中把String类设计成final? 最佳答案: 主要是为了"效率" 和 "安全性" 的缘故.若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final. 其它答案一: String和其他基本类型不同,他是个对象类型.既然是对象类型,如果是在静态方法下是必须调用静态方法或值的,如果是非静态的方法,就必须要实例化. main函数是个static的.所以String要能像其他的基本类型一样直接被调用.这也是

Python 的字符串类子串查找函数

Python 的字符串类有个很好用的函数,可很方便的用于与查找Python字符串类型对象子串相关的操作,具体的API如下: | find(...) | S.find(sub [,start [,end]]) -> int | | Return the lowest index in S where substring sub is found, | such that sub is contained within s[start:end]. Optional | arguments start