/***************************************************************************************
程序名:串的(插入、删除、截取)结构演示程序
测试环境:VC6.0
作者:MZ21G
***************************************************************************************/
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
class String
{
public:
String(){};
~String(){};
String SubString(int pos,int num); // 求子串
String Insert(String t,int pos); // 插入
String Delete(int pos,int num); // 删除
void Creat(); // 生成字符串
void Display(); // 显示
private:
char *str; // 串
int size; // 串长
};
//生成字符串
void String:: Creat()
{
char *s=new char(100);
cin>>s; // 用户输入的串
size=strlen(s); // 用户输入的串实际长度
str=new char[size]; // 定义用户输入的串长大小的串(申请内存)
if(str==0) cout<<"没有申请到空间!";
strcpy(str,s); // 用户输入的串的内容拷贝到str
}
//输出
void String::Display()
{
int i;
for(i=0;i<size;i++) cout<<str[i]; // 显示串内容
cout<<endl;
}
//求子串
String String::SubString(int pos,int num)
{
//---------------------------增强鲁棒性---------------------------------------
if ((num+pos)>size+1) // 如果截取位置+截取长度大于size+1
{
num = size-pos+1;
}
if (pos < 1)
{
pos = 1; // 输入的截取位置为0为1为负数都是串的第一个位置
}
//----------------------------------------------------------------------------
String temp; // 定义新串(申请内存)
temp.str = new char[num];
temp.size = num; // 新串长度为用户输入的截取长度
for(int i=0,j=pos-1;i<num;i++,j++)
temp.str[i] = str[j];
return temp;
}
//插入运算:在串对象s的pos位置后插入一个串t
String String::Insert(String t,int pos)
{
int i=0,j=0,k=0;
//-----------------------增强鲁棒性---------------------------
if(pos<1)
{
pos = 0;
}
if (pos>size)
{
pos = size;
}
//------------------------------------------------------------
String temp; // 定义新串
temp.size = t.size + size;
temp.str = new char[t.size + size]; // 申请内存
for (i=0;i<size;i++)
{
temp.str[i] = str[i]; // 把原串复制到新串中
}
for (i=pos,j=t.size,k=size-1;i<size;i++,k--)
{
temp.str[k+j] = str[k]; // pos位置以及pos位置后的串内容后移插入子串的长度
}
for (i=pos,j=0;j<t.size;i++,j++)
{
temp.str[i] = t.str[j]; // pos位置以及pos位置后的串内容赋值为插入子串
}
return temp;
}
//删除 :删除串中的一个子串
String String:: Delete(int pos,int num)
{
int i=0,j=0;
//---------------------------增强鲁棒性--------------------------------
if (pos<1)
{
pos = 1;
}
if(pos>size)
{
pos = size;
}
if (num>size)
{
num = size;
}
if (num<1)
{
num=0;
}
//---------------------------------------------------------------------
String temp; // 定义新串
temp.size = size - num;
temp.str = new char[size-num]; // 申请内存
for(i=0;i<temp.size;i++)
{
temp.str[i] = str[i]; // 先把str前temp.size个元素赋值到定义的新串
}
for (i=pos-1,j=pos+num-1;j<size;j++,i++) // pos-1是pos位置的下标,pos+num-1则是原串对应位置的值
{
temp.str[i] = str[j];
}
return temp;
}
//主函数
int main(int argc, char* argv[])
{ int pos,num,k;
String s,s1,t;
while (1)
{
do{
system("color 0a");
cout<<endl;
cout<<"\t\t-----------------------------------------------\n";
cout<<"\t\t 1.生成字符串 \n";
cout<<"\t\t 2.取子串 \n";
cout<<"\t\t 3.插入子串s1 \n";
cout<<"\t\t 4.删除子串 \n";
cout<<"\t\t 5.结束程序 \n";
cout<<"\t\t-----------------------------------------------\n";
cout<<"\t\t请输入你的选择(1,2,3,4,5)"; cin>>k;
switch(k){
case 1:{
cout<<"\t\t请输入一个字符串:";
s.Creat();
cout<<"\t\t字符串为:"; s.Display();
}break;
case 2:{
cout<<"\t\t请输入子串的截取位置pos:"; cin>>pos;
cout<<"\t\t请输入子串长度num:"; cin>>num;
t=s.SubString(pos,num);
cout<<"\t\t你所取的子串为:"; t.Display();
}break;
case 3:{
cout<<"\t\t请输入子串插入位置pos"; cin>>pos;
cout<<"\t\t请输入要插入的子串:";
s1.Creat();
t = s.Insert(s1,pos);
cout<<"\t\t插入后的字符串为:"; t.Display();
}break;
case 4:{
cout<<"\t\t请输入要删除子串的开始位置pos:"; cin>>pos;
cout<<"\t\t请输入要删除子串长度num:"; cin>>num;
t=s.Delete(pos,num);
cout<<"\t\t删除后的字符串为:";
t.Display();
}break;
case 5:exit(0);
} //switch
cout<<"\t\t-----------------------------------------------\n";
}while(k>=1 && k<6);
cout<<"\t\t输入错误,请重新输入.....";
}
_getch(); return 0;
}
效果演示: