#ifndef _STRING_H_ #endif _STRING_H_ //#pragma once #include<iostream> using namespace std; #define MAX_STRING_SIZE 8 typedef char SString[MAX_STRING_SIZE+1]; int Length(SString s) { return strlen(s); } int Index1(char *T, char *P) { int t_length = strlen(T); int p_length = strlen(P); for(int i=0; i<=t_length-p_length;++i) { for(int j=0; j<p_length;++j) { if(T[i+j] != P[j]) { break; } } if(j == p_length) { return i; } j = 0; } return -1; } bool StringConcat(SString T, SString s1, SString s2) { int t_length = MAX_STRING_SIZE; int s1_length = Length(s1); int s2_length = Length(s2); if(t_length >= s1_length+s2_length) { for(int i=0; i<s1_length; ++i) { T[i] = s1[i]; } for(int j=0; j<s2_length; ++j) { T[i+j] = s2[j]; } T[i+j] = '\0'; return true; } else if(t_length>s1_length && t_length<s1_length+s2_length) { for(int i=0; i<s1_length; ++i) { T[i] = s1[i]; } for(int j=0; j<t_length-s1_length; ++j) { T[i+j] = s2[j]; } T[i+j] = '\0'; return false; } else if(t_length < s1_length) { } return true; } /* 若S为空串,则返回true,否则返回false */ bool StrEmpty(SString S) { if (S[0] == NULL) return true; else return false; } /* 初始条件: 串S和T存在 */ /* 操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 */ int StrCompare(SString S, SString T) //StrCompare(S,T)比较 { int i; for (i = 1; i <= S[0] && i <= T[0]; ++i) if (S[i] != T[i]) { return S[i] - T[i]; } return S[0] - T[0]; // } /* 生成一个其值等于chars的串T */ bool StrAssign(SString T, char *chars) { int i; if (strlen(chars) > MAX_STRING_SIZE) return false; else { T[0] = strlen(chars); for (i = 1; i <= T[0]; i++) T[i] = *(chars + i - 1); return true; } } /* 由串S复制得串T */ bool StrCopy(SString T, SString S) { int i; for (i = 0; i <= S[0]; i++) T[i] = S[i]; return true; } /* 返回串的元素个数 */ int StrLength(SString S) { return S[0]; } /* 初始条件:串S存在。操作结果:将S清为空串 */ bool ClearString(SString S) { S[0] = 0;/* 令串长为零 */ return true; } /* 用T返回S1和S2联接而成的新串。若未截断,则返回TRUE,否则FALSE */ bool Concat(SString T, SString S1, SString S2) { int i; if (S1[0] + S2[0] <= MAX_STRING_SIZE) { /* 未截断 */ for (i = 1; i <= S1[0]; i++) T[i] = S1[i]; for (i = 1; i <= S2[0]; i++) T[S1[0] + i] = S2[i]; T[0] = S1[0] + S2[0]; return true; } else { /* 截断S2 */ for (i = 1; i <= S1[0]; i++) T[i] = S1[i]; for (i = 1; i <= MAX_STRING_SIZE - S1[0]; i++) T[S1[0] + i] = S2[i]; T[0] = MAX_STRING_SIZE; return false; } } /* 用Sub返回串S的第pos个字符起长度为len的子串。 */ bool SubString(SString Sub, SString S, int pos, int len) { int i; if (pos < 1 || pos > S[0] || len < 0 || len > S[0] - pos + 1) return false; for (i = 1; i <= len; i++) Sub[i] = S[pos + i - 1]; Sub[0] = len; return true; } /* 初始条件: 串S和T存在,1≤pos≤StrLength(S)+1 */ /* 操作结果: 在串S的第pos个字符之前插入串T。完全插入返回TRUE,部分插入返回FALSE */ bool StrInsert(SString S, int pos, SString T) { int i; if (pos < 1 || pos > S[0] + 1) return false; if (S[0] + T[0] <= MAX_STRING_SIZE) { /* 完全插入 */ for (i = S[0]; i >= pos; i--) S[i + T[0]] = S[i]; for (i = pos; i < pos + T[0]; i++) S[i] = T[i - pos + 1]; S[0] = S[0] + T[0]; return true; } else { /* 部分插入 */ for (i = MAX_STRING_SIZE; i <= pos; i--) S[i] = S[i - T[0]]; for (i = pos; i < pos + T[0]; i++) S[i] = T[i - pos + 1]; S[0] = MAX_STRING_SIZE; return false; } } /* 初始条件: 串S存在,1≤pos≤StrLength(S)-len+1 */ /* 操作结果: 从串S中删除第pos个字符起长度为len的子串 */ bool StrDelete(SString S, int pos, int len) { int i; if (pos < 1 || pos > S[0] - len + 1 || len < 0) return false; for (i = pos + len; i <= S[0]; i++) S[i - len] = S[i]; S[0] -= len; return true; } /* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */ /* 其中,T非空,1≤pos≤StrLength(S)。 */ /* 蛮力法*/ int Index(SString S, SString T, int pos) { int i = pos; /* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */ int j = 1; /* j用于子串T中当前位置下标值 */ while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */ { if (S[i] == T[j]) /* 两字母相等则继续 */ { ++i; ++j; } else /* 指针后退重新开始匹配 */ { i = i - j + 2; /* i退回到上次匹配首位的下一位 */ j = 1; /* j退回到子串T的首位 */ } } if (j > T[0]) return i - T[0]; else return 0; } /* 初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */ /* 操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */ bool Replace(SString S, SString T, SString V) { int i = 1; /* 从串S的第一个字符起查找串T */ if (StrEmpty(T)) /* T是空串 */ return false; do { i = Index(S, T, i); /* 结果i为从上一个i之后找到的子串T的位置 */ if (i) /* 串S中存在串T */ { StrDelete(S, i, StrLength(T)); /* 删除该串T */ StrInsert(S, i, V); /* 在原串T的位置插入串V */ i += StrLength(V); /* 在插入的串V后面继续查找串T */ } } while (i); return true; } /* 初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关) */ /* 操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串 */ bool StrReplace(SString S, SString T, SString V) { int i = 1; /* 从串S的第一个字符起查找串T */ if (StrEmpty(T)) /* T是空串 */ return false; do { i = Index(S, T, i); /* 结果i为从上一个i之后找到的子串T的位置 */ if (i) /* 串S中存在串T */ { StrDelete(S, i, StrLength(T)); /* 删除该串T */ StrInsert(S, i, V); /* 在原串T的位置插入串V */ i += StrLength(V); /* 在插入的串V后面继续查找串T */ } } while (i); return true; }
#include"String.h" void main() { char *T = "abbaba"; char *P = "abc"; int index = Index1(T,P); cout<<"index = "<<index<<endl; cout<<StrCompare( T,P)<<endl; //cout<<StrEmpty(T)<<endl;//空为1;非空为0 }
时间: 2024-10-14 17:58:10