定長串操作

串操作在數據結構中也是十分重要的一部分,首先需要理解串,串長,串相等,空格串,空串,子串的概念。我們在編程過程中,對於字符串的操作,就是一種串結構的使用。

串:是指通常說所的字符串,如:“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

源文件:

/***************************************************************************************************** 
 *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; 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章