串的基本运算
下面是我的代码实现:
#include <iostream>
#include <cstdio>
static const int Maxlen = 100;
using namespace std;
typedef struct{
char ch[Maxlen];
int len;
}String;
class S
{
public:
S(){ //构造函数初始化
S1.len = 0;
}
int Strassign (); //输入字符串
void Dispstr(); //输出字符串
void Assign(char s[]); //赋值
void Length(); //取长
void Concat(char s1[], int choose_head_or_end); //连接
void Substring(int l1, int l2);
int Replace(char z[], int length);
int Strinsert(char str[], int pos); //插入子串
int Strdelete(int pos, int len); //删除子串
private:
String S1;
};
int S :: Strassign() //输入字符串实现
{
if(S1.len != 0){
cout << "早已初始化,请选择 3.赋值 操作修改字符串。" << endl;
return 0;
}
scanf ("%s", &S1);
for(int i = 0; S1.ch[i] != '\0'; i++)
;
S1.len = i;
}
void S :: Dispstr() //输出字符串实现
{
for(int i = 0; S1.ch[i] != '\0'; i++)
printf("%c",S1.ch[i]);
printf("\n");
}
void S :: Assign(char s[])
{
for(int i = 0; S1.ch[i] != '\0'; i++)
S1.ch[i] = '\0'; //首先将需被赋值字符串清空
for(i = 0; s[i] != '\0'; i++)
S1.ch[i] = s[i]; //赋值
S1.ch[i+1] = '\0';
for(i = 0; S1.ch[i] != '\0'; i++) //重新获得字符串长度
;
S1.len = i;
}
void S :: Length()
{
cout << "当前字符串长度为" << S1.len << endl;
}
void S :: Concat (char s1[], int choose_head_or_end)
{
int *pi = new int; // 衡量输入字符串的长度
for(int i = 0; s1[i] != '\0'; i++) // 获取输入字符串长
;
*pi = i;
if(choose_head_or_end == 1){ //连入现有字符串前面
for(i = S1.len-1; i >= 0; i--) //先将现有字符串集体后移,移动长度为输入字符串长度
S1.ch[i + *pi] = S1.ch[i];
S1.ch[S1.len + *pi] = '\0';
for(i = 0; i < *pi; i++) //把输入字符串的值赋到空出的现有字符串前
S1.ch[i] = s1[i];
S1.len += *pi; //将表示长度的变量加上输入字符串的长度
}
else if(choose_head_or_end == 2){ //连入现有字符串后面
for(i = 0; i < *pi; i++)
{
S1.ch[S1.len] = s1[i];
S1.len ++; //在这一过程中自然改变长度值
}
S1.ch[S1.len] = '\0';
}
else
{ cout << "输入错误" << endl; }
delete pi;
}
void S :: Substring (int l1, int l2)
{
for(int i = l1 - 1; i < l1 - 1 + l2; i++ )
{
cout << S1.ch[i];
}
printf("\n");
}
int S :: Replace (char z[], int length) //子串替换
{
for(int i = 0; z[i] != '\0'; i ++) //取子串长
;
if(i + length > S1.len)
{
cout << "越界" << endl;
return 0;
}
for(i = 0; z[i] != '\0'; i ++)
{
S1.ch[i+length-1] = z[i];
}
return 1;
}
int S :: Strinsert(char str[], int pos)
{
if(pos > S1.len){
cout << "输入越界" << endl;
return 0;
}
int length;
for(int i = 0; str[i] != '\0'; i ++) //取子串长
;
length = i;
for (i = S1.len; i > pos-1; i -- )
S1.ch[i + length -1] = S1.ch[i-1]; //元素后移,为要插入元素腾出空余。
S1.ch[S1.len + length ] = '\0';
for (i = 0; i < length; i++) //赋值
{
S1.ch[pos + i -1] = str[i];
}
S1.len += length;
return 1;
}
int S :: Strdelete(int pos, int len)
{
for (int i = pos - 1; i < pos - 1 + len; i ++) //先删除要删除的子串
S1.ch[i] = '\0';
for(i = pos - 1 + len; i <= S1.len - 1; i++) //删除的子串后面元素前移
S1.ch[i - len] = S1.ch[i];
S1.len -= len; //长度减删除子串长
S1.ch[S1.len] = '\0'; //剃掉多余的
return 1;
}
void main()
{
S MyString;
int If_End = 0;
int Choose;
while (If_End == 0){
cout << "请选择操作: 1.输入字符串。2.输出字符串。 3.赋值。4.取长。 5.连接。" ;
cout << "6.返回字符串子串。 7.子串的替换。8.子串插入。 9.删除子串。 10.结束。" << endl;
cin >> Choose;
switch (Choose){
case 1:
cout << "请输入:(输入字符串长度应不超过100)" ;
MyString.Strassign();
break;
case 2:
MyString.Dispstr();
break;
case 3:
{
char *pq = new char [Maxlen];
cout << "请输入要赋的值" << endl;
scanf ("%s",&*pq);
MyString.Assign(pq);
delete [] pq;
break;
}
case 4:
MyString.Length();
break;
case 5:
{
int *py = new int;
char *pu = new char [Maxlen];
cout << "首先输入字符串" ;
scanf("%s",&*pu);
cout << "你是想把输入的字符串接到现有字符串前(输入一),还是现有字符串后(输入二)";
cin >> *py;
MyString.Concat(pu,*py);
delete py;
delete pu;
break;
}
case 6:
{
int *pa = new int;
int *ps = new int;
cout << "请先输入从第几个元素开始" << endl;
cin >> *pa;
cout << "请输入子串长度" << endl;
cin >> *ps;
MyString.Substring(*pa,*ps);
delete pa;
delete ps;
break;
}
case 7:
{
cout << "请先输入要替换的子串" << endl;
char *pd = new char [Maxlen];
scanf("%s",&*pd);
int *pf = new int;
cout << "输入要替换的开始位置" << endl;
cin >> *pf;
MyString.Replace(pd,*pf);
delete pd;
delete pf;
break;
}
case 8:
{
char *pv = new char [Maxlen];
int *pb = new int;
cout << "输入要插入的子串" << endl;
scanf ("%s",&*pv);
cout << "输入在第几个元素前插入(整型变量)" << endl;
cin >> *pb;
MyString.Strinsert(pv, *pb);
delete pv;
delete pb;
break;
}
case 9:
{
int *delete_str = new int;
int *delete_len = new int;
cout << "请先输入删除子串位置" << endl;
cin >> *delete_str ;
cout << "请输入删除子串长度" << endl;
cin >> *delete_len;
MyString.Strdelete(*delete_str,*delete_len);
delete delete_str;
delete delete_len;
break;
}
case 10:
If_End = 1;
break;
default:
cout << "输入有误" << endl;
break;
}
}
}