结构体定义
typedef char ElemType;
typedef struct{
ElemType *ch ;
int length;
}SString;
初始化串
/*初始化串*/
void InitStr(SString &Str){
Str.length=0;
Str.ch=NULL;//S的数据存储指向为空.
}
给串赋值
/*
赋值
1.判断str中的ch是否为空
2.定位获得ch的长度
3.str中的ch申请空间,并为str中的ch赋值
*/
bool StrAssign(SString &Str,char *ch){
if(Str.ch){
//如果Str中的数据不为空
free(Str.ch);
Str.ch=NULL;//Str的数据存储指向为空.
}
int len=0;
char *c=ch;//指向传过来的ch数组
//定位ch的长度,
while(*c){
//解引用 ,当c中的数据不为空
len++;
c++;
}
//当ch数组为空
if(len==0){
cout<<"空串,赋值失败!"<<endl;
InitStr(Str);
return false;
}else{
Str.ch=(char *)malloc(sizeof(char)*(len+1));
//cout<<(int)Str.ch[len]<<endl;
if(Str.ch==NULL){
cout<<"空间分配失败!"<<endl;
return false;
}else{
for(int i=0;i<=len;i++){
Str.ch[i]=ch[i];
}
Str.length=len;
return true;
}
}
}
求主串的子串
/*
求主串的子串
str为主串
SubStr为子串
从主串中的第pos个位置开始,依次把len个元素作为字串substr的元素
*/
bool GetSubString(SString &Str,SString &SubStr,int pos,int len ){
if(pos<0||pos>=Str.length||len<0||len>Str.length-pos) {
cout<<"位置或者长度不合法!"<<endl;
return false;
}
if(SubStr.ch){
//如果SubStr中的数据不为空
free(SubStr.ch);
SubStr.ch=NULL;//SubStr的数据存储指向为空.
}
if(len==0){
SubStr.ch=NULL;
SubStr.length=0;
cout<<"字串的长度为0"<<endl;
return true;
}else{
//分配空间
SubStr.ch=(char *)malloc(sizeof(char)*(len+1));
int sublen=0;//字串长度
for(int i=pos-1,j=0;j<len;i++,j++){
//i<pos+len-1
SubStr.ch[j]=Str.ch[i] ;
sublen++;
}
cout<<sublen;
SubStr.ch[sublen]='\0';//以 '\0'标志着串的结尾
SubStr.length = sublen;
return true;
}
}
比较两个字符串的值
/*
比较两个字符串的值
S>T :返回值>0
S=T :返回值=0
S<T :返回值<0
*/
int StrCompare(SString S,SString T){
for(int i=0;i<S.length&&i<T.length;i++){
if(S.ch[i]!=T.ch[i])
return S.ch[i]-T.ch[i];
}
//如果所有字符都相等,那么长度更长的字符串更大
return S.length -T.length;
}
拼接两个字符串
/*
拼接串
把串s2拼接在s1的后面生成一个新的串
*/
bool Concat(SString &Str,SString &S1,SString &S2){
if(Str.ch){
//如果Str中的数据不为空
free(Str.ch);
Str.ch=NULL;//Str的数据存储指向为空.
}
Str.ch=(char *)malloc(sizeof(char)*(S1.length+S2.length+1));
if(Str.ch==NULL){
cout<<"空间分配失败!"<<endl;
return false;
}else{
int i=0,j=0;
//将子串1的内容写入Str中
for(;i<S1.length;i++){
Str.ch[i]=S1.ch[i];
}
//将子串2的内容写入Str中
for(;j<S2.length;j++){
Str.ch[i+j]=S2.ch[j];
}
Str.ch[i+j]='\0';
Str.length=S1.length+S2.length;
return true;
}
}
复制串
/*
复制串
把Str中的值赋值一份给T
*/
bool StrCopy(SString &Str,SString &T){
T.ch=(char *)malloc(sizeof(char)*(Str.length+1));
//cout<<Str.length;
for(int i=0;i<Str.length;i++) {
T.ch[i]=Str.ch[i];
}
T.ch[Str.length]='\0' ;
T.length=Str.length;
return true;
}
清空串
/*清空串 */
bool ClearStr(SString &Str){
if(Str.ch){
//如果Str中的数据不为空
free(Str.ch);
Str.ch=NULL;//Str的数据存储指向为空.
}
Str.length=0;
return true;
}
具体实现
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef char ElemType;
typedef struct{
ElemType *ch ;
int length;
}SString;
/*初始化串*/
void InitStr(SString &Str){
Str.length=0;
Str.ch=NULL;//S的数据存储指向为空.
}
/*
赋值
1.判断str中的ch是否为空
2.定位获得ch的长度
3.str中的ch申请空间,并为str中的ch赋值
*/
bool StrAssign(SString &Str,char *ch){
if(Str.ch){
//如果Str中的数据不为空
free(Str.ch);
Str.ch=NULL;//Str的数据存储指向为空.
}
int len=0;
char *c=ch;//指向传过来的ch数组
//定位ch的长度,
while(*c){
//解引用 ,当c中的数据不为空
len++;
c++;
}
//当ch数组为空
if(len==0){
cout<<"空串,赋值失败!"<<endl;
InitStr(Str);
return false;
}else{
Str.ch=(char *)malloc(sizeof(char)*(len+1));
//cout<<(int)Str.ch[len]<<endl;
if(Str.ch==NULL){
cout<<"空间分配失败!"<<endl;
return false;
}else{
for(int i=0;i<=len;i++){
Str.ch[i]=ch[i];
}
Str.ch[len+1]='\0';
Str.length=len;
return true;
}
}
}
/*
求主串的子串
str为主串
SubStr为子串
从主串中的第pos个位置开始,依次把len个元素作为字串substr的元素
*/
bool GetSubString(SString &Str,SString &SubStr,int pos,int len ){
if(pos<0||pos>=Str.length||len<0||len>Str.length-pos) {
cout<<"位置或者长度不合法!"<<endl;
return false;
}
if(SubStr.ch){
//如果SubStr中的数据不为空
free(SubStr.ch);
SubStr.ch=NULL;//SubStr的数据存储指向为空.
}
if(len==0){
SubStr.ch=NULL;
SubStr.length=0;
cout<<"字串的长度为0"<<endl;
return true;
}else{
//分配空间
SubStr.ch=(char *)malloc(sizeof(char)*(len+1));
int sublen=0;//字串长度
for(int i=pos-1,j=0;j<len;i++,j++){
//i<pos+len-1
SubStr.ch[j]=Str.ch[i] ;
sublen++;
}
cout<<sublen;
SubStr.ch[sublen]='\0';//以 '\0'标志着串的结尾
SubStr.length = sublen;
return true;
}
}
/*清空串 */
bool ClearStr(SString &Str){
if(Str.ch){
//如果Str中的数据不为空
free(Str.ch);
Str.ch=NULL;//Str的数据存储指向为空.
}
Str.length=0;
return true;
}
/*
拼接串
把串s2拼接在s1的后面生成一个新的串
*/
bool Concat(SString &Str,SString &S1,SString &S2){
if(Str.ch){
//如果Str中的数据不为空
free(Str.ch);
Str.ch=NULL;//Str的数据存储指向为空.
}
Str.ch=(char *)malloc(sizeof(char)*(S1.length+S2.length+1));
if(Str.ch==NULL){
cout<<"空间分配失败!"<<endl;
return false;
}else{
int i=0,j=0;
//将子串1的内容写入Str中
for(;i<S1.length;i++){
Str.ch[i]=S1.ch[i];
}
//将子串2的内容写入Str中
for(;j<S2.length;j++){
Str.ch[i+j]=S2.ch[j];
}
Str.ch[i+j]='\0';
Str.length=S1.length+S2.length;
return true;
}
}
/*
比较两个字符串的值
S>T :返回值>0
S=T :返回值=0
S<T :返回值<0
*/
int StrCompare(SString S,SString T){
for(int i=0;i<S.length&&i<T.length;i++){
if(S.ch[i]!=T.ch[i])
return S.ch[i]-T.ch[i];
}
//如果所有字符都相等,那么长度更长的字符串更大
return S.length -T.length;
}
/*
复制串
把Str中的值赋值一份给T
*/
bool StrCopy(SString &Str,SString &T){
T.ch=(char *)malloc(sizeof(char)*(Str.length+1));
//cout<<Str.length;
for(int i=0;i<Str.length;i++) {
T.ch[i]=Str.ch[i];
}
T.ch[Str.length]='\0' ;
T.length=Str.length;
return true;
}
int main(){
SString str,str1,str2,str3,str4,str5,str6;
InitStr(str);
InitStr(str1);
InitStr(str2);
InitStr(str3);
InitStr(str4);
InitStr(str5);
InitStr(str6);
char ch1[] = "I am pig!";
char ch2[] = "You are pig!";
char ch3[] = "We are pig!";
StrAssign(str1,ch1);
StrAssign(str2,ch2);
StrAssign(str3,ch3);
cout<<"字符串1为:"<<str1.ch<<" 串的长度为:"<<str1.length<<endl;
cout<<"字符串2为:"<<str2.ch<<" 串的长度为:"<<str2.length<<endl;
cout<<"字符串3为:"<<str3.ch<<" 串的长度为:"<<str3.length<<endl;
Concat(str,str1,str2);
cout<<"合并字符串1和字符串2为:"<<str.ch<<" 合并之后长度为:"<<str.length<<endl;
Concat(str4,str,str3);
cout<<"全部字符串合并为:"<<str4.ch<<" 合并之后长度为:"<<str4.length<<endl;
GetSubString(str,str5,7,10);
cout<<"从合并后的总串中第7位开始取,取长度为10生成的字串为:"<<str5.ch<<"字串长度为:"<<str5.length<<endl;
cout<<"字符串5比字符串1大:"<<StrCompare(str5,str1) <<endl;
cout<<"字符串1比字符串5大:"<<StrCompare(str1,str5) <<endl;
StrCopy(str2,str6);
cout<<"将字符串2复制一份给字符串6,字符串6为:"<<str6.ch<<"字串长度为:"<<str6.length<<endl;//<<str6.ch
ClearStr(str1) ;
ClearStr(str2) ;
ClearStr(str3) ;
ClearStr(str4) ;
ClearStr(str5) ;
ClearStr(str6) ;
return 0;
}
运行结果: