串操做在數據結構中也是十分重要的一部分,首先須要理解串,串長,串相等,空格串,空串,子串的概念。咱們在編程過程當中,對於字符串的操做,就是一種串結構的使用。編程
串:是指一般說所的字符串,如:「abcde」,「PI」等 串長:是指字符串的長度,如:「abcde」長度爲5,「PI」長度爲2 串相等:兩個字符串的長度和內容均相等,如:「abcde」和「abcde」 空格串:字符串由一個或多個空格組成,空格串不是空串,空格串有長度,如:「 」 空串:字符串長度爲零,如:「」 子串:一個串的某一部分,如:「abcde」的「a」,「bc」,「bcd」等都是子串
頭文件:數據結構
/***************************************************************************************************** *Copyright:Yue Workstation * *FileName:FixedLengthString.h * *Function: 串的相關數據定義和函數聲明 * *Author:Abel Lee * *CreateOn:2011-8-11 * *Log:2011-8-11 建立 *****************************************************************************************************/ #ifndef FIXED_LENGTH_STRING_H #define FIXED_LENGTH_STRING_H #include <stdio.h> #include <string.h> #include <stdlib.h> #include "global.h" typedef unsigned char SString[MAX_LENGTH + 1];//SString[0]存儲串長度 SString *StringCopy(SString *S, SString T); SString *StringClear(SString *S); SString *StringCat(SString *S, const SString T); SString *StringReplace(SString *S, SString T, SString V); int StringInstert(SString *S, SString T, int pos); int StringInit(SString *S, const char *str); int StringCompare(SString S,SString T); int StringIndex(SString S, SString T, int pos); int StringLength(SString S); int StringDestroy(SString *S); void StringPrint(SString S); int StringSub(SString *S, SString T, int pos, int len); #endif
源文件:ide
/***************************************************************************************************** *Copyright:Yue Workstation * *FileName:FixedLengthString.c * *Function:串的基本操做 * *Author:Abel Lee * *CreateOn:2011-8-11 * *Log:2011-8-11 建立 *****************************************************************************************************/ #include "../inc/FixedLengthString.h" /**************************************************************************************************** *Function Name:StringCopy * *Function:串拷貝 * *Parameter: S:要初始化的串 * str:初始化常量值 * *Return Value:成功返回0,失敗返回-1 * *Author:Abel Lee * *Log:2011-9-15 ***************************************************************************************************/ SString *StringCopy(SString *S, SString T) { int i = 0; if(*S == NULL || T == NULL) { return NULL; } while(T[i]) { (*S)[i] = T[i]; i++; } (*S)[i] = T[i]; return S; } /**************************************************************************************************** *Function Name: StringCompare * *Function: 比較串S和T是否相等 * *Parameter: S:參加比較的字符串 * T:參加比較的字符串 * *Return Value: 相等返回0,S > T 返回1,S < T 返回-1 * *Author:Abel Lee * *Log:2011-9-16 ***************************************************************************************************/ int StringCompare(SString S,SString T) { int i = 0; int flag = 0; if(S[0] - T[0] >= 0) { flag = S[0]; } else { flag = T[0]; } for(i = 1; i < flag; i++) { if(S[i] - T[i] > 0) { return 1; } else if(S[i] - T[i] < 0) { return -1; } else { } } return 0; } /**************************************************************************************************** *Function Name: StringClear * *Function: 清空字符串 * *Parameter: S:要清空的字符串 * *Return Value: 成功返回S,失敗返回NULL * *Author:Abel Lee * *Log:2011-9-16 ***************************************************************************************************/ SString *StringClear(SString *S) { int i = 0; if(S == NULL) { return NULL; } while((*S)[i]) { (*S)[i] = '\0'; i++; } return S; } /**************************************************************************************************** *Function Name: StringCat * *Function: 字符串鏈接,將T鏈接到S結尾 * *Parameter: S:原始串 * T: 鏈接串 * *Return Value: 成功返回S,失敗返回NULL * *Author:Abel Lee * *Log:2011-9-16 ***************************************************************************************************/ SString *StringCat(SString *S, const SString T) { int i = 1; int j = 1; if(S == NULL || T == NULL) { return NULL; } if((*S)[0] + T[0] > MAX_LENGTH) { return NULL; } while((*S)[i]) { i++; } while(T[j]) { (*S)[i] = T[j]; i++; j++; } (*S)[i] = '\0'; (*S)[0] += T[0]; return S; } /**************************************************************************************************** *Function Name: StringSub * *Function: 在字符串T中從pos處開始截取長度爲len的子串存儲在S中 * *Parameter: S:存儲子串 * T:母串 * pos:母串中的位置 * len:要截取的串長 * *Return Value: 成功返回0,失敗返回-1 * *Author:Abel Lee * *Log:2011-9-20 ***************************************************************************************************/ int StringSub(SString *S, SString T, int pos, int len) { int i = 1; if(pos < 1 || pos > T[0] || len < 0 || len > T[0] - pos + 1) { perror("Input Parameter is error! pos < 1 || pos > T[0] || len < 0 || len > T[0] - pos + 1\n"); return -1; } (*S)[0] = len; while(len--) { (*S)[i++] = T[pos++]; } (*S)[i] = '\0'; return 0; } /**************************************************************************************************** *Function Name: StringReplace * *Function: 用V串替換主串S中全部與T串相等但不重疊的子串 * *Parameter: S:主串 * T:須要在S中查找的原始串 * V:須要在S中找到T後替換成的串 * *Return Value: 成功返回子串的位置,失敗返回-1 * *Author:Abel Lee * *Log:2011-9-16 ***************************************************************************************************/ SString *StringReplace(SString *S, SString T, SString V) { int pos = 1; int len = T[0]; int i = 0; SString STemp; SString StrLeft; if(len <= 0 || (*S)[0] < T[0]) { perror("Input Parameter is error! len <= 0 || (*S)[0] < T[0]\n"); return NULL; } while((*S)[0] - pos +1 >= len) { StringSub(&STemp,*S,pos,len); if(StringCompare(STemp,T) == 0) { i = 0; while((*S)[i+pos+len-1]) { i++; StrLeft[i] = (*S)[i+pos+len-1]; } StrLeft[i] = '\0'; StrLeft[0] = i - 1; (*S)[pos] = '\0'; (*S)[0] = pos -1; StringCat(S,V); StringCat(S,StrLeft); pos = pos + V[0]; continue; } pos++; } return S; } /**************************************************************************************************** *Function Name: StringInstert * *Function:在串S的第pos位置插入串T * *Parameter: S:母串 * T:被插入的串 * pos:插入的位置 * *Return Value: 成功返回0,失敗返回-1 * *Author:Abel Lee * *Log:2011-9-21 ***************************************************************************************************/ int StringInstert(SString *S, SString T, int pos) { SString StrLeft; int i = 1; if((*S)[0] + T[0] > MAX_LENGTH || pos < 1 || pos > (*S)[0] + 1) { perror("Input parameter is error,(*S)[0] + T[0] > MAX_LENGTH || pos < 1 || pos > (*S)[0] + 1\n"); return -1; } while((*S)[i+pos-1]) { StrLeft[i] = (*S)[i+pos-1]; i++; } StrLeft[i] = '\0'; StrLeft[0] = i - 1; (*S)[pos] = '\0'; (*S)[0] = pos -1; StringCat(S,T); StringCat(S,StrLeft); return 0; } /**************************************************************************************************** *Function Name: StringIndex * *Function: 字符串索引,在母串S中的pos位置開始查找T,若存在返回母串S中的 位置 * *Parameter: S:母串 * T:子串 * pos:串位置 * *Return Value: 成功返回主串中子串的第一次出現的位置,未找到返回0,失敗返回-1 * *Author:Abel Lee * *Log:2011-9-16 ***************************************************************************************************/ int StringIndex(SString S, SString T, int pos) { int len = T[0]; SString STemp; if(pos < 1 || S[0] < T[0] || pos > S[0]) { perror("Input Parameter is error! pos < 1 || S[0] < T[0] || pos > S[0]\n"); return -1; } while(S[0] - pos +1 >= len) { StringSub(&STemp,S,pos,len); if(StringCompare(STemp,T) == 0) { return pos; } pos++; } return 0; } /**************************************************************************************************** *Function Name:StringInit * *Function:初始化一個串 * *Parameter: S:要初始化的串 * str:初始化常量值 * *Return Value:成功返回0,失敗返回-1 * *Author:Abel Lee * *Log:2011-9-15 ***************************************************************************************************/ int StringInit(SString *S, const char *str) { int i = 0; const char *p = str; if(strlen(str) > MAX_LENGTH) { perror("The string length is very large!\n"); return -1; } while(*p != '\0') { i++; (*S)[i] = *p; p++; } (*S)[0] = i; (*S)[++i] = '\0'; return 0; } /**************************************************************************************************** *Function Name:StringInit * *Function:打印字符串中的內容 * *Parameter: S:要打印的字符串 * *Return Value:成功返回0,失敗返回-1 * *Author:Abel Lee * *Log:2011-9-15 ***************************************************************************************************/ void StringPrint(SString S) { printf("%s\n",(char *)(S+1)); return; } /**************************************************************************************************** *Function Name: StringLength * *Function:獲取字符串長度 * *Parameter: S:求長字符串 * *Return Value: 字符串長度 * *Author:Abel Lee * *Log:2011-9-16 ***************************************************************************************************/ int StringLength(SString S) { return S[0]; } /**************************************************************************************************** *Function Name: StringDestroy * *Function: 字符串銷燬 * *Parameter: S:要銷燬的字符串 * *Return Value: 成功返回0,失敗返回-1 * *Author:Abel Lee * *Log:2011-9-16 ***************************************************************************************************/ int StringDestroy(SString *S) { int i = 0; if(S == NULL) { return -1; } while((*S)[i]) { (*S)[i] = '\0'; i++; } return 0; }