串操作在数据结构中也是十分重要的一部分,首先需要理解串,串长,串相等,空格串,空串,子串的概念。我们在编程过程中,对于字符串的操作,就是一种串结构的使用。
串:是指通常说所的字符串,如:“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;
}
原文地址:http://blog.51cto.com/14207158/2352640
时间: 2024-10-09 23:03:23