String的c語言實現

#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也不好輸出 感覺是多此一舉了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章