在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不能再用字符数组的长度来判断字符串的长度了。
#include <iostream>
#include <stdbool.h>
#define MAXSIZE 225
using namespace std;
typedef unsigned char SString[MAXSIZE + 1];//typdef unsigned char a[MAX_LEN]意思是定义类型unsigned char
// [MAX_LEN]为a的形式
/******************************************/
void init(SString &T)//初始化
{
T[0] = 0; //一定要初始化,否则判空无法完成 t[0]为t装入字符串的长度
return ;
}
/******************************************/
void Create(SString &T, char chars[])//创建
{
int i;
for(i=0;chars[i]!='\0' && i+1<=MAXSIZE;i++)
{
T[i+1]=chars[i];
}
T[0]=i;
}
/******************************************/
void Display(SString &T)//遍历
{
int i;
for(i=1;i<=T[0];i++)
cout<<T[i];
}
/******************************************/
void Contact(SString &T1,SString &T2,SString &T3)//串连接 t1与t2连接成t3
{
int i,k;
for(i=1;i<=MAXSIZE && i<=T1[0];i++)
{
T3[i]=T1[i];
}
k=i-1;//k为t1的长度
T3[0]=k;
for(i=1;i+k<=MAXSIZE && i<=T2[0];i++)
{
T3[i+k]=T2[i];
}
T3[0]=T3[0]+i-1;//如果t1的长度大于max则因为上面的for里面有i=1所以t3的长度还是t1的长度
}
/******************************************/
void Copy(SString &T,SString &S)//串拷贝
{
int i;
for(i=1;i<=T[0];i++)
S[i]=T[i];
S[0]=T[0];
}
/******************************************/
bool empty(SString &T)//串判空
{
if(T[0]==0)
return true;
else
return false;
}
/******************************************/
int lengh(SString &T)//求串长
{
return T[0];
}
/******************************************/
void clear(SString &T)
{
T[0]=0;
}
/******************************************/
//若T大于S 返回值>0 若T等于S 返回值=0 若T小于S 返回值<0
//如果T串是以S串开头的主串 只能返回0
//如果S串是以T串开头的主串 可能返回不确定值
//所以该函数应该是再判断了双方都不是对方的子串的时候才使用
//串比较,如果第一个字符相等,则比较第二个字符,如果t1大于s1则返回正数,小于返回负数,t和s相等返回0
int compare(SString &T,SString &S)//串比较
{
int i,n=0;
for(i=1;i<=T[0];i++)
{
if(T[i]!=S[i])
{
n=T[i]-S[i];
break;
}
}
return n;
}
/******************************************/
void substr(SString &S,SString &sub, int pos,int len)//子串提取操作从pos的位置提取长度为len的子串
{
int i;
if(pos<0 || len<0 || pos+len-1>S[0])
return;
for(i=1;i<=len;i++)
{
sub[i]=S[pos+i-1];
}
sub[0]=i-1;
}
/******************************************/
void insert(SString &S,int pos,SString &T)//插入
{
SString new_;
SString temp;
substr(S,temp,1,pos-1);//把s的第一个字符到pos-1个字符提取成子串temp
Display(temp);cout<<endl;
Contact(temp,T,new_); //把子串temp和要插入的字符串t连接成字符串new_
Display(new_);cout<<endl;
substr(S,temp,pos,S[0]-pos+1 );//把s的第pos个字符到最后一个字符提取成子串temp
Display(new_);cout<<endl;
Contact(new_,temp,S);//把new_子串和temp子串连接成串s,注意new_和temp的顺序影响新生成字符
Display(S);cout<<endl;
}
/*****************************************/
//从第一个到要删除的位置的前一个的字符提取子串,从要删除的最后一个字符的下一个到最后提取子串
//然后把两个子串从连接给s
void delete_(SString &s,int pos,int len)//串删除
{
SString temp;
SString sub;
if(pos<1 || pos+len>s[0]+1)
return ;
substr(s, temp, 1, pos-1);
substr(s,sub,pos+len,s[0]-pos-len+1);
Contact(temp, sub , s);
}
/******************************************/
int Index(SString &S, SString &T, int pos)//寻找子串返回子串首次在母串中出现的首字符的位置
{
int i=pos;//从第几个位置开始寻找子串t
int j=1;//从子串的第一个字符开始进行匹配
while (i<=S[0] && j<=T[0])//当i不大于s0的长度且j不大于t0的长度的时候进入循环
{
if (S[i] == T[j])//如果当前字符匹配成功,则匹配下一个
{
++i;
++j;
}
else //如果当前匹配不成功,j为t的第一个字符,i为当前匹配到的字符
{
i = i-j+2;//i不写成i++的原因是虽然可以表示如果第一个字符不符合而后面的符合
j = 1; //但不能表示当第一个符合s的第二个不符合t的第二个但不一定不符合t的第一个,所以应该保留当前位置
} //如果是i++则会继续前进
}
if (j > T[0])
return i-T[0];
else
return 0;
}
/****************************/
int main()
{
SString t1,t2;
char a[100],b[100];
cin>>a;
cin>>b;
init(t1);
init(t2);
Create(t1, a);
Create(t2, b);
return 0;
}
http://blog.csdn.net/zhuyi2654715/article/details/6740707