📄 串的索引操作1.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 + -