⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 串的索引操作1.txt

📁 这是一个字符串索引的程序
💻 TXT
字号:
#define maxsize 100
#define smax 20
#include<iostream>
#include<cstring>
using namespace std;



typedef struct
{
	int length;
	int straddress;//字符串首地址
}hstring;            //串的储存印象类型(索引信息)


class String
{
   private:
	   char strstore[maxsize];
	   int free;
   public:
	   String();
       ~String();
	   void creatstr();           //创建初始字符串
	   int  getfree();           //获取自由指针的位置
	   void strassign(hstring *str1,char *str2);//堆尾添加
	   int  strmodify(hstring str1,hstring str2,char *s);//子串的修改
	   void strcopy(hstring *str1,hstring str2);//子串的复制
	   int strsub(hstring *substr,hstring str,int count1,int len);//查找(获取)子串	           void strconcat(hstring str1,hstring str2,hstring *str);//串的连接
	   void strpartprint(hstring *str);//部分子串的输出
	   void strprint(int leng);//任意串的输出
};



String::String()
{
	int i;
	for(i=0;i<maxsize;i++)
		strstore[i]=0;
}



String::~String()
{}



void String::creatstr()                                             //创建初始字符串
{
	int n,i;
	cout<<"请输入字符串的字符个数(输入的数字大于等于1并且小于等于100):";
	cin>>n;

	if(n<1||n>maxsize-1)
		cout<<"输入的数据错误,请重新输入:"<<endl;                          ?
	else
       for(i=0;i<n;i++)
	   {
		cout<<"请输入第"<<i+1<<"个字符:";
		cin>>strstore[i];
	   }
}


int String::getfree() 
{
	int n=0;
	for(int i=0;i<maxsize;i++)
	{	
           if(strstore[i]!=0)
	      n++;
        } 
        return n;
}


void String::strassign(hstring *str1,char *str2)                       //在堆尾进行插入
{
	int count=0,len=0,i=0,n;
	while(str2[i]!=0)                            ?
	{
		len++;
		i++;
	}
	n=getfree();
	if(len<1||n+len-1>maxsize)
		cout<<"输入字符串不合法"<<endl;                             ?
	else
	{
		for(count=0;count<len;count++)         //用循环语句再堆中逐个插入
			strstore[n+count]=str2[count];
		str1->straddress=n;
		str1->length=len;
	}
}




int String::strmodify(hstring str1,hstring str2,char *s)  //字符串修改,将str1改为str2
{       s=str2.straddress;
	int i,n,j;
        n=getfree();
	if(str1.length==str2.length)                     //等长修改
	{
		for(i=0;i<str2.length;i++)
		   strstore[str1.straddress+i-1]=s[i];
		return n-str1.length+str2.length;
	}
	else                                            //修改字符的长度小于原字符长度
		if(str1.length>str2.length)             
		{
			for(i=0;i<str2.length;i++)
				strstore[str1.straddress+i-1]=s[i];
            j=i;
            for(;j<str1.length;j++)
                strstore[i]=0;
            return n+str1.length-str2.length;
		}
	else                                            //修改字符长度大于原字符的长度
		{   
			for(i=0;i<str2.length;i++)      ?
		     	strstore[n+i]=s[i];
			return n+str2.length;
		}
}

void String::strcopy(hstring *str1,hstring str2)       //串的拷贝
{
	int count,n;
	n=getfree();
	if(n+str2.length-1>maxsize)
		cout<<"堆空间已满!"<<endl;
	else
	{
		for(count=0;count<str2.length;count++)
			strstore[n+count]=strstore[str2.straddress-1+count];
		str1->straddress=n+1;
		str1->length=str2.length;
	}
}


int String::strsub(hstring *substr,hstring str,int count1,int len)
{
    int count;
	count=count1;
	if(count<1||len<1||len>str.length-count+1)
	{
		cout<<"输入的长度错误"<<endl;
	    return 0;
	}
	else
	{
		substr->straddress=str.straddress+count-1;
		substr->length=len;
		return 1;
	}
}


void String::strconcat(hstring str1,hstring str2,hstring *str)
{
	hstring temp;
	strcopy(str,str1);
	strcopy(&temp,str2);      ?
	str->length=str1.length+str2.length;
	str->straddress=str1.straddress;
}


void String::strpartprint(hstring *str)
{

	int i,j=0;
	for(i=str->straddress;i<str->straddress+str->length;i++)
	{
		cout<<strstore[i-1]<<" ";
		j++;
		if(j%5==0)
			cout<<endl;
	}
	cout<<endl;
}



void String::strprint(int leng)
{
	int i,j=0;
	for(i=0;i<leng;i++)
	{
		cout<<strstore[i]<<" ";
		j++;
	    if(j%5==0)
			cout<<endl;
	}
	cout<<endl;
}


void main()
{
	String str;
	char newstr[smax];
    int count,i,len,n;
	hstring s1,s2,s3;
    int c;
    for(i=0;i<smax;i++)
		newstr[i]=0;
    do
	{  

          cout<<"========================================================="<<endl;
          cout<<"                  串的索引存储"<<endl;
          cout<<"========================================================="<<endl;
          cout<<"           1、创建原始字符串;"<<endl;
          cout<<"           2、获取自由指针的位置;"<<endl;
          cout<<"           3、向堆中即堆尾添加新的字符"<<endl;
          cout<<"           4、对堆中任意一段字符的修改;"<<endl;
          cout<<"           5、从堆中获取任意一段的字符;"<<endl;
          cout<<"           6、从指定的一个字符数组中获取子串;"<<endl;
          cout<<"           7、字符串的连接;"<<endl;
          cout<<"           8、对部分字符的输出;"<<endl;
          cout<<"           9、对字符堆的输出;"<<endl;
          cout<<"           10、清屏;"<<endl;
          cout<<"           11、退出。"<<endl;
          cout<<"========================================================="<<endl;

		  cout<<"输入操作步骤:";
		  cin>>c;


          switch(c)
		  {
	        case 1:
                       cout<<"<<创建原始字符串>>"<<endl;
	                   str.creatstr();
                       break;
	        case 2:
			           cout<<"<<获取自由指针的位置>>"<<endl;
		               n=str.getfree();
	                   cout<<"自由指针的位置是:free="<<n<<endl;
                       break;
	        case 3: 
			           cout<<"<<向堆中即堆尾添加新的字符>>"<<endl;
		               cout<<"请输入新字符数组的个数:";
					   cin>>n;
                       for(i=0;i<n;i++)
					   {
		                    cout<<"请输入第"<<i+1<<"个字符:";
		                    cin>>newstr[i];
					   }
                       str.strassign(&s3,newstr);
					   cout<<"新添加的字符数组为:"<<endl;
					   //str.strpartprint(&s3);
                       break;
	        case 4:  
			          cout<<"<<对堆中任意一段字符的修改>>"<<endl;
					  cout<<"请输入新字符数组的个数:";
					  cin>>n;
                      for(i=0;i<n;i++)
					  {
		                  cout<<"请输入第"<<i+1<<"个字符:";
		                  cin>>newstr[i];
					  }
					  cout<<"请输入被修改的元素的起始地址:";
					  cin>>s1.straddress;
					  cout<<"请输入被修改的元素的长度:";
					  cin>>s1.length;
					  s2.straddress=1;
					  s2.length=n;
                      if(n!=s1.length)
					  {
	                      n=str.strmodify(s1,s2,newstr);
                         // str.strprint(n);
					  }
                     else
					 {  
                           n=str.strmodify(s1,s2,newstr);
		                   n=str.getfree();
		                   //str.strprint(n);
					 }
					 break;
	        case 5:
			          cout<<"<从堆中获取任意一段的字符>>"<<endl;
					  cout<<"请输入要输出的字符起始地址:";
	                  cin>>s1.straddress;
					  cout<<"请输入要输出的字符的长度:";
					  cin>>s1.length;
					  str.strcopy(&s3,s1);
				      //str.strpartprint(&s3);
					  break;
	        case 6:
			          cout<<"<<从指定的一个字符数组中获取子串>>"<<endl;
					  cout<<"请输入指定字符的起始地址:";
	                  cin>>s1.straddress;
					  cout<<"请输入指定字符的长度:";
					  cin>>s1.length;
					  cout<<"请输入子串的起始地址:";
					  cin>>count;
					  cout<<"请输入子串的长度:";
					  cin>>len;
					  i=str.strsub(&s3,s1,count,len);
					  if(i==1)
	                     cout<<"请选8进行输出!!!"<<endl;
                      break;
	        case 7:
			          cout<<"<<字符串的连接>>"<<endl;
					  cout<<"请输入第一个字符串的起始地址:";
	                  cin>>s1.straddress;
					  cout<<"请输入第一个字符串的长度:";
					  cin>>s1.length;
                      cout<<"请输入第二个字符串的起始地址:";
	                  cin>>s2.straddress;
					  cout<<"请输入第二个字符串的长度:";
					  cin>>s2.length;  
		              str.strconcat(s1,s2,&s3);
					  //str.strpartprint(&s3);
                      break;
            case 8:
			          cout<<"<<对部分字符的输出>>"<<endl;
		              str.strpartprint(&s3);
                      break;
            case 9:
			          cout<<"<<对字符堆的输出>>"<<endl;
		              n=str.getfree();
                      str.strprint(n);
                      break;
            case 10:
		              system("cls");
		      break;
           
	    case 11:
		              exit(1);
	    default:
		              cout<<"不存在此操作!!!!!!"<<endl;
		  }
	}while(c!='q');
   

}







⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -