第一个字符不存数据,存储字符串的长度
main函数和声明
# include# include # include # include #define MAXSIZE 40 typedef int ElemType; typedef char String[MAXSIZE+1]; bool StrAssign(String T,char *chars); bool StrCopy(String T,String S); bool StrEmpty(String S); int StrCompare(String S,String T); int StrLength(String S); bool ClearString(String S); bool Concat(String T,String S1,String S2); bool SubString(String Sub,String S,int pos,int len); int Index(String S, String T, int pos); int Index2(String S, String T, int pos); bool StrInsert(String S,int pos,String T); bool StrDelete(String S,int pos,int len); bool Replace(String S,String T,String V); void StrPrint(String T); int main() { int i,j; bool k; char s; String t,s1,s2; printf("请输入串s1: "); k=StrAssign(s1,"abcd"); if(!k) { printf("串长超过MAXSIZE(=%d)n",MAXSIZE); exit(0); } printf("串长为%d 串空否?%d(1:是 0:否)n",StrLength(s1),StrEmpty(s1)); StrCopy(s2,s1); printf("拷贝s1生成的串为: "); StrPrint(s2); printf("请输入串s2: "); k=StrAssign(s2,"efghijk"); if(!k) { printf("串长超过MAXSIZE(%d)n",MAXSIZE); exit(0); } i=StrCompare(s1,s2); if(i<0) s='<'; else if(i==0) s='='; else s='>'; printf("串s1%c串s2n",s); k=Concat(t,s1,s2); printf("串s1联接串s2得到的串t为: "); StrPrint(t); if(k==false) printf("串t有截断n"); ClearString(s1); printf("清为空串后,串s1为: "); StrPrint(s1); printf("串长为%d 串空否?%d(1:是 0:否)n",StrLength(s1),StrEmpty(s1)); printf("求串t的子串,请输入子串的起始位置,子串长度: "); i=2; j=3; printf("%d,%d n",i,j); k=SubString(s2,t,i,j); if(k) { printf("子串s2为: "); StrPrint(s2); } printf("从串t的第pos个字符起,删除len个字符,请输入pos,len: "); i=4; j=2; printf("%d,%d n",i,j); StrDelete(t,i,j); printf("删除后的串t为: "); StrPrint(t); i=StrLength(s2)/2; StrInsert(s2,i,t); printf("在串s2的第%d个字符之前插入串t后,串s2为:n",i); StrPrint(s2); i=Index(s2,t,1); printf("s2的第%d个字母起和t第一次匹配n",i); SubString(t,s2,1,1); printf("串t为:"); StrPrint(t); Concat(s1,t,t); printf("串s1为:"); StrPrint(s1); Replace(s2,t,s1); printf("用串s1取代串s2中和串t相同的不重叠的串后,串s2为: "); StrPrint(s2); return 0; }
生成一个其值等于chars的串T
// 生成一个其值等于chars的串T bool StrAssign(String T,char *chars) { if (strlen(chars) > MAXSIZE) return false; int i; T[0] = strlen(chars); for (i = 1; i < T[0]; ++i) { T[i] = *(chars+i-1); } return true; }
由串S复制得串T
// 由串S复制得串T bool StrCopy(String T,String S) { int i = 0; for (i = 0; i <= strlen(S); ++i) { T[i] = S[i]; } return true; }
判断S串是否为空
//判断S串是否为空 bool StrEmpty(String S) { if (S[0] == 0) return true; else return false; }
串S和T存在 若S>T,则返回值>0;若S=T,则返回值=0;若S
int StrCompare(String S,String T) { int i; for (i = 1; i <= S[0] && i <= T[0]; ++i) { if (T[i] != S[i]) return S[i]-T[i]; } return S[0] - T[0]; }
返回串的元素个数
// 返回串的元素个数 int StrLength(String S) { return S[0]; }
串S存在,将S清为空串
// 串S存在,将S清为空串 bool ClearString(String S) { S[0] = 0; return true; }
用T返回S1和S2联接而成的新串。若未截断,则返回true,否则false
// 用T返回S1和S2联接而成的新串。若未截断,则返回true,否则false bool Concat(String T,String S1,String S2) { int i; if (S1[0] + S2[0] <= MAXSIZE) { for(i = 1; i <= S1[0]; ++i) T[i] = S1[i]; for (i = 1; i <= S2[0]; ++i) T[i+S1[0]] = S2[i]; T[0] = S1[0] + S2[0]; return true; } else { for (i = 1; i <= S1[0]&&i<=MAXSIZE; ++i) T[i] = S1[i]; for (i = 1; i <= MAXSIZE-S1[0]; ++i) T[i+S1[0]] = S2[i]; T[0] = MAXSIZE; return false; } }
用Sub返回串S的第pos个字符起长度为len的子串。
// 用Sub返回串S的第pos个字符起长度为len的子串。 bool SubString(String Sub,String S,int pos,int len) { if (pos < 1 || pos > S[0] || len < 1 || len > S[0]-pos+1) return false; int i; for (i = 1; i <= len; ++i) { Sub[i] = S[pos+i-1]; } Sub[0] = len; return true; }
返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。
其中,T非空,1≤pos≤StrLength(S)。
int Index(String S, String T, int pos) { int i = pos; int j = 1; while (i <= S[0] && j <= T[0]) { if (S[i] == T[j]) { i++; j++; } else { i = i-j+2; j = 1; } } if (j > T[0]) return i-T[0]; else return 0; }
T为非空串。若主串S中第pos个字符之后存在与T相等的子串, 则返回第一个这样的子串在S中的位置,否则返回0
int Index2(String S, String T, int pos) { int m, n, i; String Sub; if (pos > 0) { m = S[0]; n = T[0]; i = pos; while (i < m-n+1) { SubString(Sub, S, i, n); if (StrCompare(T, Sub) != 0) ++i; else return i; } } return 0; }
串S和T存在,1≤pos≤StrLength(S)+1
在串S的第pos个字符之前插入串T。完全插入返回ture,部分插入返回false
bool StrInsert(String S,int pos,String T) { int i; if (pos < 1 || pos > S[0]+1) return false; if (S[0] + T[0] <= MAXSIZE) { for (i = S[0]; i >= pos; --i) { S[i+T[0]] = S[i]; } for (i = 1; i <= T[0]; ++i) { S[i+pos-1] = T[i]; } S[0] += T[0]; } else { for (i = MAXSIZE; i <= pos; --i) { S[i] = S[i-T[0]]; } for (i = pos; i < T[0]+pos; ++i) { S[i] = T[i-pos+1]; } S[0] = MAXSIZE; return false; } }
串S存在,1≤pos≤StrLength(S)-len+1
从串S中删除第pos个字符起长度为len的子串
bool StrDelete(String S,int pos,int len) { if (pos < 1 || pos > S[0] || len < 1 || len > S[0]-pos+1) return false; int i; for (i = pos; i < pos+len; ++i) { S[i] = S[i+len]; } S[0] -= len; return true; }
串S,T和V存在,T是非空串(此函数与串的存储结构无关 )
用V替换主串S中出现的所有与T相等的不重叠的子串
bool Replace(String S,String T,String V) { int i = 1; if(StrEmpty(T)) return false; do { i = Index(S, T, i); if (i) { StrDelete(S, i, T[0]); StrInsert(S, i, V); i += StrLength(V); } }while(i); return true; }
输出字符串
//输出字符串 void StrPrint(String T) { int i = 1; for (; i <= T[0]; ++i) printf("%c", T[i]); printf("n"); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)