SString.h #ifndef SSTRING_H_H #define OK 0 #define ERROR -1 #define MAX_LENGTH 255 typedef unsigned char SString[MAX_LENGTH + 1]; //第0个位置存放串的长度 int sstr_assign(SString, const char*); int sstr_print(SString); int sstr_copy(SString, SString); int sstr_empty(SString); int sstr_compare(SString, SString); int clear_sstring(SString); int sstr_strcat(SString, SString, SString); int sstr_subString(SString, SString, int, int); int sstr_index(SString, SString, int); int sstr_replace(SString, SString, SString); int sstr_insert(SString, SString, int); int sstr_delete(SString, int, int); #endif SString.cpp #include<stdio.h> #include<stdlib.h> #include"SString.h" //产生一个SString类型的串,其值等于sstr int sstr_assign(SString T, const char *sstr) { int ix = 0; while(sstr[ix] != '/0') { T[ix + 1] = sstr[ix++]; //如果空间耗尽,则不再复制。 if(ix == MAX_LENGTH) break; } //保存串的长度 T[0] = ix; return OK; } int sstr_copy(SString T, SString S) { if(0 == S[0]) return ERROR; int len = S[0]; int ix = 1; while(len-- > 0) { T[ix] = S[ix++]; } T[0] = S[0]; return OK; } int sstr_empty(SString T) { if(0 == T[0]) return true; return false; } int sstr_subString(SString sub, SString T, int pos, int len) { if(0 == T[0] || pos < 1 || len > MAX_LENGTH || len + pos > T[0] + 1) return ERROR; int ix = 1; while(len-- > 0) { sub[ix++] = T[pos++]; if(ix > MAX_LENGTH) break; } sub[0] = ix - 1; return OK; } int sstr_compare(SString T, SString S) { if(0 == T[0] && 0 == S[0]) return ERROR; int ix = 1; int T_len = T[0]; int S_len = S[0]; while(T_len > 0 && S_len > 0) { if((int)T[ix] > (int)S[ix]) { return 1; } else if((int)T[ix] < (int)S[ix]) { return -1; } else { T_len--; S_len--; ix++; } } if(T_len == S_len) return 0; else if(T_len == 0) return -1; else return 1; return OK; } int clear_sstring(SString T) { if(T[0] == 0) return ERROR; T[0] = 0; return OK; } int sstr_strcat(SString T, SString S1, SString S2) { if(0 == S1[0] && 0 == S2[0]) { T[0] = 0; return ERROR; } int S1_len = S1[0]; int S2_len = S2[0]; int total_len = S1_len + S2_len; int ix = 1; int i = 1; while(ix <= total_len) { while(S1_len-- > 0) { T[ix++] = S1[i++]; if(ix > MAX_LENGTH) { T[0] = ix - 1; return OK; } } i = 1; while(S2_len-- > 0) { T[ix++] = S2[i++]; if(ix > MAX_LENGTH) { T[0] = ix - 1; return OK; } } } T[0] = ix - 1; return OK; } //返回从pos位置开始,返回第一次与T中的子串相同的首位置。 int sstr_index(SString S, SString T, int pos) { if(0 == S[0] || 0 == T[0] || pos > S[0]) return ERROR; SString sub; while(pos != S[0] + 1) { int len = T[0]; sstr_subString(sub,S,pos,len); if(0 == sstr_compare(sub,T)) return pos; pos++; } return OK; } int sstr_replace(SString S, SString T, SString V) { if(0 == S[0] || 0 == T[0] || 0 == V[0]) return ERROR; int ix = 1; int S_pos = 1; while(1) { int V_len = V[0]; int pos = sstr_index(S,T,S_pos); if(pos == -1 || 0 == pos) return OK; int s = 0; s = T[0] < V[0] ? V[0] - T[0] : T[0] - V[0]; //如果替换字符串跟被替换字符串的长度不一,就需要移位 if(T[0] - V[0] > 0) { while(V_len-- > 0) { S[pos++] = V[ix++]; } S_pos = pos; ix = 1; int times = S[0] - S_pos; while(times-- > 0) { S[pos] = S[pos + s]; pos++; } S[0] -= s; } else if(T[0] - V[0] < 0) { int tmp = S[0] - pos - T[0] + 1; int i = S[0]; while(tmp-- > 0) { if(S[0] + 1 > MAX_LENGTH) break; S[i + 1] = S[i--]; } while(V_len-- > 0) { S[pos++] = V[ix++]; } S_pos = pos; ix = 1; S[0] += s; } else { while(V_len-- > 0) { S[pos++] = V[ix++]; } S_pos = pos; ix = 1; } } return OK; } //在pos的位置插入T int sstr_insert(SString S, SString T, int pos) { if(0 == S[0] || 0 == T[0] || pos > S[0] + 1 || pos < 1) return ERROR; int T_len = T[0]; int p = S[0]; int ix = 1; int times = S[0] - pos + 1; while(times-- > 0) { if(p + 1 > MAX_LENGTH) return ERROR; S[p + T_len] = S[p--]; } S[0] += T_len; while(T_len-- > 0) S[pos++] = T[ix++]; return OK; } int sstr_delete(SString S, int pos, int len) { if(0 == S[0] || pos < 1 || pos + len > S[0] + 1 || pos > S[0] || len < 1 || len > S[0] - pos + 1) return ERROR; int times = S[0] - pos; S[0] -= len; while(times-- > 0) { S[pos] = S[pos + len]; pos++; } return OK; } int sstr_print(SString T) { int cnt = T[0]; int ix = 1; while(cnt-- > 0) { printf("%c",T[ix++]); } printf("/n"); return OK; }