1 ///page71 2 ///测试样例:nihao 3 ///output 4 /*5 5 5 nihao 6 0 7 10 nihaonihao 8 4 aoni 9 4 10 14 nihaoaoninihao 11 9 noninihao 12 13 nombxzmbxzhao*/ 13 #include <stdio.h> 14 #include <stdlib.h> 15 #include<string.h> 16 #include <malloc.h> 17 #define TRUE 1 18 #define FALSE 0 19 #define OK 1 20 #define ERROR 0 21 #define INFEASIBLE -1 22 #define OVERFLOW -2 23 #define maxlen 255 24 typedef char sstring[maxlen+1]; 25 typedef int status; 26 int StrLength(sstring s){ 27 int cnt=0; 28 for(int i=0;s[i];i++) 29 cnt++; 30 return cnt; 31 } 32 status StrAssign(sstring &t,char *chars){ 33 if(StrLength(chars)>maxlen) 34 return ERROR; 35 t[0]=StrLength(chars); 36 for(int i=1;i<=t[0];i++) 37 t[i]=*(chars+i-1); 38 t[t[0]+1]=‘\0‘; 39 } 40 void clears(sstring &s){ 41 s[0]=0; 42 } 43 void StrCopy(sstring &s,sstring t){// 由串S复制得串T 44 int i; 45 for(i=0;i<=t[0];i++) 46 s[i]=t[i]; 47 s[s[0]+1]=‘\0‘; 48 } 49 status StrEmpty(sstring s){// 若S为空串,则返回TRUE,否则返回FALSE 50 if(s[0]==0) 51 return TRUE; 52 else 53 return FALSE; 54 } 55 int StrCompare(sstring s,sstring t){// 初始条件:串S和T存在。操作结果:若S>T,则返回值>0; 56 //若S=T,则返回值=0;若S<T,则返回值<0 57 int i; 58 for(i=1;i<=s[0]&&i<=t[0];++i) 59 if(s[i]!=t[i]) 60 return s[i]-t[i]; 61 return s[0]-t[0]; 62 } 63 status concat(sstring &t,sstring s1,sstring s2){ 64 if(s1[0]+s2[0]<=maxlen){ 65 for(int i=1;i<=s1[0];i++) 66 t[i]=s1[i]; 67 for(int i=1;i<=s2[0];i++) 68 t[i+s1[0]]=s2[i]; 69 t[0]=s1[0]+s2[0]; 70 t[t[0]+1]=‘\0‘; 71 } 72 else if(s1[0]<maxlen){ 73 for(int i=1;i<=s1[0];i++) 74 t[i]=s1[i]; 75 for(int i=1;i<=maxlen-s1[0];i++) 76 t[i+s1[0]]=s2[i]; 77 t[0]=maxlen; 78 } 79 else{ 80 for(int i=1;i<=maxlen;i++) 81 t[i]=s1[i]; 82 t[0]=maxlen; 83 } 84 } 85 status SubString(sstring &Sub,sstring S,int pos,int len)// 用Sub返回串S的第pos个字符起长度为len的子串。 86 { 87 int i; 88 if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1) 89 return ERROR; 90 for(i=1;i<=len;i++) 91 Sub[i]=S[pos+i-1]; 92 Sub[0]=len; 93 Sub[len+1]=‘\0‘; 94 return OK; 95 } 96 int Index(sstring S,sstring T,int pos){// 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0。 97 int i,j; 98 if(1<=pos&&pos<=S[0]){ 99 i=pos; 100 j=1; 101 while(i<=S[0]&&j<=T[0]){ 102 if(S[i]==T[j]) // 继续比较后继字符 103 { 104 ++i; 105 ++j; 106 } 107 else // 指针后退重新开始匹配 108 { 109 i=i-j+2; 110 j=1; 111 } 112 } 113 if(j>T[0]) 114 return i-T[0]; 115 else 116 return 0; 117 } 118 else 119 return 0; 120 } 121 status StrInsert(sstring &S,int pos,sstring T){// 在串S的第pos个字符之前插入串T。 122 int i; //完全插入返回TRUE,部分插入返回FALSE 123 if(pos<1||pos>S[0]+1) 124 return ERROR; 125 if(S[0]+T[0]<=maxlen){ // 完全插入 126 for(i=S[0];i>=pos;i--) 127 S[i+T[0]]=S[i]; 128 for(i=pos;i<pos+T[0];i++) 129 S[i]=T[i-pos+1]; 130 S[0]+=T[0]; 131 S[S[0]+1]=‘\0‘; 132 return TRUE; 133 } 134 else{ // 部分插入 135 for(i=maxlen;i>=pos+T[0];i--) 136 S[i]=S[i-T[0]]; 137 for(i=pos;i<pos+T[0]&&i<=maxlen;i++) 138 S[i]=T[i-pos+1]; 139 S[0]=maxlen; 140 141 return FALSE; 142 } 143 } 144 status StrDelete(sstring &S,int pos,int len){//从串S中删除第pos个字符起长度为len的子串 145 int i; 146 if(pos<1||pos>S[0]-len+1||len<0) 147 return ERROR; 148 for(i=pos+len;i<=S[0];i++) 149 S[i-len]=S[i]; 150 S[0]-=len; 151 S[S[0]+1]=‘\0‘; 152 return OK; 153 } 154 155 status Replace(sstring &S,sstring T,sstring V) // 用V替换主串S中出现的所有与T相等的不重叠的子串 156 { 157 int i=1; // 从串S的第一个字符起查找串T 158 status k; 159 if(StrEmpty(T)) // T是空串 160 return ERROR; 161 do 162 { 163 i=Index(S,T,i); // 结果i为从上一个i之后找到的子串T的位置 164 if(i) // 串S中存在串T 165 { 166 StrDelete(S,i,T[0]); // 删除该串T 167 k=StrInsert(S,i,V); // 在原串T的位置插入串V 168 if(!k) // 不能完全插入 169 return ERROR; 170 i+=V[0]; // 在插入的串V后面继续查找串T 171 } 172 }while(i); 173 S[S[0]+1]=‘\0‘; 174 return OK; 175 } 176 177 int main(){ 178 sstring s,t,in; 179 scanf("%s",in); 180 //scanf("%s",t); 181 StrAssign(t,in); 182 printf("%d\n",t[0]); 183 184 StrCopy(s,t); 185 printf("%d %s\n",s[0],s+1); 186 187 printf("%d\n",StrCompare(s,t)); 188 189 sstring all; 190 concat(all,s,t); 191 printf("%d %s\n",all[0],all+1); 192 193 sstring sub; 194 SubString(sub,all,4,4); 195 printf("%d %s\n",sub[0],sub+1); 196 197 int locate=Index(all,sub,2); 198 printf("%d\n",locate); 199 200 StrInsert(all,6,sub); 201 printf("%d %s\n",all[0],all+1); 202 203 StrDelete(all,2,5); 204 printf("%d %s\n",all[0],all+1); 205 206 sstring s1,s2; 207 s1[0]=2; 208 s1[1]=‘n‘,s1[2]=‘i‘,s1[3]=‘\0‘; 209 s2[0]=4,s2[1]=‘m‘,s2[2]=‘b‘,s2[3]=‘x‘,s2[4]=‘z‘,s2[5]=‘\0‘; 210 Replace(all,s1,s2); 211 printf("%d %s\n",all[0],all+1); 212 return 0; 213 }
时间: 2024-10-03 14:15:03