串的(插入、删除、截取)结构演示程序(C++)

本文介绍了一个串操作程序,包括串的生成、子串提取、插入和删除等功能,并提供了使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/***************************************************************************************
程序名:串的(插入、删除、截取)结构演示程序
测试环境: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;
}

效果演示:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值