您的位置:首页 > 编程语言 > C语言/C++

String的c语言实现

2015-06-13 22:42 567 查看
#include<stdio.h>
#include<stdlib.h>
#define MAXSTRSIZE 255
typedef unsigned char SString[MAXSTRSIZE+2];//0号单元存放串长度,最后一个单元 存放'\0'
typedef int Status;
Status StrAssign(SString &T,char *chars){
int i;
for(i=0;chars[i]!='\0';i++) T[i+1]=chars[i];
T[i+1]='\0'; T[0]=(char) i;
return 1;
}

Status StrCopy(SString &T,SString S){
int i;
for(i=1;S[i];i++) T[i]=S[i];
T[i]='\0'; T[0]=S[0];
return 1;
}

Status IsStrEmpty(SString S){
if(!(S[0])) return 1;
return 0;
}

Status StrLength(SString T){
return T[0];
}
//相同返回1,不同返回0
Status StringCompare(SString S,SString T){
if(T[0]!=S[0]) return 0;
for(int i=1;i<S[0];i++){
if(T[i]!=S[i]) return 0;
}
return 1;

}

Status ClearString(SString &T){
for(int i=1;i<T[0]+1;i++) T[i]='\0';
T[0]=0;
return 1;
}

Status Concat(SString &T,SString S1,SString S2){
int i;
if(S1[0]+S2[1]<=MAXSTRSIZE){
for(i=1;S1[i];i++) T[i]=S1[i];
for(;S2[i];i++) T[i]=S2[i];
}
else if(S1[0]<MAXSTRSIZE){
for(i=1;S1[i];i++) T[i]=S1[i];
for(;i<=MAXSTRSIZE;i++) T[i]=S2[i];
T[i]='\0';T[0]=MAXSTRSIZE;
}
else {
for(i=1;i<=MAXSTRSIZE;i++) T[i]=S1[i];
T[i]='\0'; T[0]=S1[0];
}
return 1;
}

Status SubString(SString &Sub,SString S,int pos,int len){
if(pos<1||pos>StrLength(S)||len<0||len>(StrLength(S)-pos+1)) return 0;
int i;
for(i=pos;i<=pos+len;i++) Sub[i]=S[i];
Sub[0]=len;Sub[i]='\0';
return 1;
}

Status printString(SString S){
if(!S[0]) return 0;
for(int i=1;i<=S[0];i++) printf("%c",S[i]);
return 1;
}

//若主串S中存在和串T值相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则函数值为0
Status Index(SString S,SString T,int pos){
if(T[0]==0||pos<1||pos>StrLength(S)) return 0;
int n=StrLength(S),m=StrLength(T),i=pos;
SString sub;
while(i<=n-m+1){
SubString(sub,S,i,m);
if(!StringCompare(sub,T)) i++;
else return i;
}
return 0;
}

int main(){
SString t,s;
char ss[10]={"asdsa"};
StrAssign(s,ss);
StrCopy(t,s);
StrAssign(t,"asdsa");
if(IsStrEmpty(t)) printf("EMPTY\n");
if(StringCompare(t,s)) printf("same\n");
printf("%s\n",t);
printf("%d\n",StrLength(t));
printString(s);
printf("\n");
return 0;
}
其实前面长度不用设成MAXSIZE加2的,最后一位用于加\0其实完全没必要,反正输出用printstr 而且第一个单元是长度 用%s也不好输出 感觉是多此一举了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: