用字符串实现string
//sqstring.h
#include<cstdio>
#include<iostream>
using namespace std;
#define MaxSize 100
typedef struct
{
char data[MaxSize]; //字符串
int length; //字符串的长度
} SqString;
void StrAssign(SqString &s,char cstr[]){
//创建字符串
int i;
for(i = 0; cstr[i] != '\0'; i++) //依次拷贝
s.data[i] = cstr[i];
s.length = i; //更新长度
}
void DestroyStr(SqString &s){
//销毁字符串
s = "";
}
int StrLength(SqString s){
//字符串的长度
return s.length;
}
void StrCopy(SqString &s,SqString t){
//字符串的拷贝 把t拷贝给s
for(int i = 0; i < t.length; i++)
s.data[i] = t.data[i];
s.length = t.length;
}
bool StrEqual(SqString s,SqString t){
//判断两个字符串是否相等
bool same = true;
if(s.length!=t.length) //先判断长度
same = false;
else
for(int i = 0; i < s.length; i++){ //依次比较
if(s.data[i] != t.data[i]){
same = false;
break;
}
}
return same;
}
SqString Concat(SqString s,SqString t){
//把字符串t连接到s后面
SqString str;
int i;
str.length =s.length + t.length;
for(i = 0; i < s.length; i++)
str.data[i] = s.data[i];
for(i = 0; i < t.length; i++)
str.data[s.length+i] = t.data[i];
return str;
}
SqString InsStr(SqString s1,int i,SqString s2){
//从s1的第i的位置后面插入s2
int j;
SqString str;
str.length = 0;
if(i <= 0 || i > s1.length+1)
return str;
for(j = 0; j < i - 1; j++)
str.data[j] = s1.data[j];
for(j = 0; j < s2.length; j++)
str.data[i+j-1] = s2.data[j];
for(j = i - 1; j < s1.length; j++)
str.data[s2.length+j] = s1.data[j];
str.length = s1.length + s2.length;
return str;
}
SqString RepStr(SqString s,int i,int j,SqString t){
//用字符串t代替字符串s的第i到j位
int k;
SqString str;
str.length = 0;
if(i <= 0 || i > s.length || i + j -1 > s.length)
return str;
for(k = 0; k < i-1; k++)
str.data[k] = s.data[k];
for(k = 0; k < t.length; k++)
str.data[i+k-1] = t.data[k];
for(k = i + j - 1; k < s.length; k++)
str.data[t.length+k-j] = s.data[k];
str.length = s.length + t.length - j;
return str;
}
SqString DelStr(SqString s,int i,int j){
//把s的第i到j位删除
int k;
SqString str;
str.length = 0;
if(i <= 0 || i > s.length || i+j > s.length+1)
return str;
for(k = 0; k < i-1; k++)
str.data[k] = s.data[k];
for(k = i + j - 1; k < s.length; k++)
str.data[k-j] = s.data[k];
str.length = s.length - j;
return str;
}
SqString SubStr(SqString s,int i,int j){
//返回s的从第i到j的字串
SqString str;
int k;
str.length = 0;
if(i <= 0 || i > s.length || j < 0 || i+j-1 > s.length)
return str;
for(k = i - 1; k < i + j - 1; k++)
str.data[k-i+1] = s.data[k];
str.length = j;
return str;
}
void DispStr(SqString s){
//展示s
if(s.length > 0){
for(int i = 0; i < s.length; i++)
cout << s.data[i];
cout << endl;
}
}
#include"sqstring.h"
int main()
{
SqString s,s1,s2,s3,s4;
cout << "顺序串的基本运算如下" << endl;
cout << " (1)建立串s和串s1" << endl;
StrAssign(s,"abcdefghijklmn");
StrAssign(s1,"123");
cout << " (2)输出串s:";
DispStr(s);
cout << " (3)输出串s的长度" << StrLength(s) << endl;
cout << " (4)在串s的第九个字符位置插入串s1而产生串s2" << endl;
s2 = InsStr(s,9,s1);
cout << " (5)输出串s2:";
DispStr(s2);
cout << " (6)删除串s第2个字符开始的5个字符而产生的串s2" << endl;
s2 = DelStr(s,2,3);
cout << " (7)输出串s2:";
DispStr(s2);
cout << " (8)将串s第2个字符开始的5个字符替换成s1而产生的串s2" << endl;
s2 = RepStr(s,2,5,s1);
cout << " (9)输出串s2:";
DispStr(s2);
cout << " (10)提取串s的第二个字符开始的10个字符而产生串s3" << endl;
s3 = SubStr(s,2,10);
cout << " (11)输出串s3:";
DispStr(s3);
cout << " (12)将串s1和串s2连接起来而产生的串s4" << endl;
s4 = Concat(s1,s2);
cout << " (13)输出串s4:";
DispStr(s4);
DestroyStr(s);
DestroyStr(s1);
DestroyStr(s2);
DestroyStr(s3);
DestroyStr(s4);
getchar();
return 0;
}