这个没有借助C语言的库函数,而是自己写了一下字符串操作函数.
测试用例有点水,将就着看吧。。。
附上c语言字符串操作函数
// strcpy(p, p1) 复制字符串
// strncpy(p, p1, n) 复制指定长度字符串
// strcat(p, p1) 附加字符串
// strncat(p, p1, n) 附加指定长度字符串
// strlen§ 取字符串长度
// strcmp(p, p1) 比较字符串
// strcasecmp忽略大小写比较字符串
// strncmp(p, p1, n) 比较指定长度字符串
// strchr(p, c) 在字符串中查找指定字符
// strrchr(p, c) 在字符串中反向查找
// strstr(p, p1) 查找字符串
// strpbrk(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素
// strspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移
// strcspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移
// strtod(p, ppend) 从字符串 p 中转换 double 类型数值,并将后续的字符串指针存储到 ppend 指向的 char 类型存储。
// strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制,设置为 0 以根据特定格式判断所用进制,0x, 0X 前缀以解释为十六进制格式整型,0 前缀以解释为八进制格式整型
// atoi§ 字符串转换到 int 整型
// atof§ 字符串转换到 double 符点数
// atol§ 字符串转换到 long 整型*
函数声明
//string base operator
//才意识到这是要自己动手造轮子,当函数名想不起来的时候还是很有帮助滴
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 40
#define MAXSTRLEN 10
typedef int Status;
typedef char SString[MAXSIZE+1];
//本代码中的字符串操作函数
/*******************************声明部分****************************************/
Status StrAssign(SString T,char *chars);
//生成一个其值等于chars的串T 第一个元素为字符串长度
int StrLength(SString S);
//操作结果:返回S的元素个数,成为串的长度
Status StrCopy(SString S,SString T);
//由串S复制得串T
Status StrEmpty(SString S);
//若S为空串返回TURE
int StrCompare(SString S,SString T);
//操作结果:若S>T,则返回值>0;若S = T,则返回值 =0;若S<T,则返回值<0
int StrLength(SString S);
//返回S的元素个数,称为串的长度
Status ClearString(SString S);
//将S清为0串
Status StrConcat(SString T,SString S1,SString S2);
//用T返回由S1,S2连结而成的新串
Status SubString(SString Sub, SString T,int pos,int len);
//用Sub返回串T的第pos个字符起长度为len的子串
int Index(SString S,SString T,int pos);
//若主串S中存在和串T值相同的子串,则返回它在主串中第pos个字符之后第一次出现的位置;否则函数值为0
Status Replace(SString S,SString T,SString V);
//用V替换主串S中出现的所有与T相等的不重叠的子串
Status StrDelete(SString S,int pos,int len);
//从主串S中删除第pos个字符起长度为len的子串
Status StrInsert(SString S,int pos,SString T);
//从主串S第pos个字符之前插入子串T
Status DestroyString(SString S);
//串S被摧毁
Status StrTraverse(SString S);
//遍历串S
函数定义
/*******************************函数部分****************************************/
Status
StrAssign(SString T,char *chars)
{
int i,ct;
for(i = 0;i <= MAXSIZE;i++)
T[i] = '\0';
T[0] = strlen(chars);
for(ct = 1;*chars != '\0';ct++,chars++)
{
T[ct] = *chars;
}
return OK;
}
//由串S复制得串T
//这里用了双重指针
Status
StrCopy(SString S,SString T)
{
int i;
for(i = 0;i<=S[0];i++)
T[i] = S[i];
return OK;
}
Status
StrEmpty(SString S)
{
// if(S[0] == 0)
// return OK;
// else
// return ERROR;
//简单写法
return S[0] == 0;
}
int
StrCompare(SString S,SString T)
{
int cnt = 1;
while(cnt <= S[0] && cnt <= T[0])
{
if(S[cnt] == T[cnt])
cnt ++;
else
return S[cnt] - T[cnt];
}
//若都一直相等,那么字符串长的那个就大
return S[0] - T[0];
}
int
StrLength(SString S)
{
return S[0];
}
//将S清为0串,这个好简单的方法。。后面直接覆盖值就行
Status
ClearString(SString S)
{
S[0] = 0;
return OK;
}
Status
StrConcat(SString T,SString S1,SString S2)
{
int count,i;
int uncut;
//不用截断
if(S1[0]+S2[0] <= MAXSTRLEN)
{
T[0] = S1[0] + S2[0];
for(count = 1;count <= S1[0];count++)
T[count] = S1[count];
for(count = S1[0]+1,i = 1;count <= T[0];count++,i++)
T[count] = S2[i];
uncut = TRUE;
}
//超出长度,需要截断S2
else if(S1[0] < MAXSTRLEN)
{
T[0] = MAXSTRLEN;
for(count = 1;count <= S1[0];count++)
T[count] = S1[count];
for(count = S1[0]+1,i = 1;count <= T[0];count ++,i++)
T[count] = S2[i];
uncut = FALSE;
}
//S1就需要截断
else
{
T[0] = MAXSTRLEN;
for(count = 1;count <= S1[0];count ++)
T[count] = S1[count];
}
return OK;
}
Status
SubString(SString Sub,SString T,int pos,int len)
{
if( pos<1 || pos>T[0] || len < 0 || len > T[0]-pos+1 )
return ERROR;
int ct,cnt;
for(ct = 1,cnt = pos;cnt <= len+pos;ct++,cnt++)
Sub[ct] = T[cnt];
Sub[0] = len+1;
return OK;
}
int
Index(SString S,SString T,int pos)
{
SString Sub;
int i = pos;
if(pos > 0)
{
int n = StrLength(S);
int m = StrLength(T);
while( i <= n-m+1)
{
SubString(Sub,S,i,m-1);
if(StrCompare(Sub,T) == 0)
return i;
else
i++;
}//while
}//if
printf("no existence~\n");
return 0;
}
//串S,T,V存在,T是非空串
//用V替换主串S中所有出现的与T相等的不重叠的子串
Status
Replace(SString S,SString T,SString V)
{
int i;
i = Index(S,T,1);
while(S[0]-T[0]+V[0] <= MAXSTRLEN && i)
{
StrDelete(S,i,T[0]);
StrInsert(S,i,V);
i += V[0];
i = Index(S,T,i);
}
if(i==0)
return OK;
else
return ERROR;
}
Status
StrInsert(SString S,int pos,SString T)
{
int i;
if(pos<1 || pos>S[0]+1 || S[0]+T[0]>MAXSTRLEN)
return ERROR;
for(i = S[0];i>=pos;i--)
S[i+T[0]] = S[i];
for(i = pos;i<pos+T[0]-1;i++)
S[i] = T[i-pos+1];
S[0] += T[0];
return OK;
}
Status
StrDelete(SString S,int pos,int len)
{
int i;
if(pos<1 || pos+len-1>S[0] || len < 0)
return ERROR;
for(i = pos+len;i<=S[0];i++)
S[i-len] = S[i];
S[0] -= len;
return OK;
}
Status
DestroyString(SString S)
{
free(S);
return OK;
}
Status
StrTraverse(SString S)
{
int i = 1;
while(i <= S[0]) //字符串下标是如何开始的啊,数组当然从0开始啦,不过第一个位置存的是字符串的长度
{
printf("%c",S[i]);
i++;
}
printf("\n");
return OK;
}
//测试用例
int main(int argc, char const *argv[])
{
//测试用例
char *chars1 = "abcdefghijk";
char *chars2 = "defgh";
char *chars3 = "/**/";
SString S,T,V,W;
SString Q;
StrAssign(Q,chars3);
printf("\t**After StrAssign**\n");
StrAssign(S,chars1);
StrAssign(T,chars2);
printf("S: ");
StrTraverse(S);
printf("T: ");
StrTraverse(T);
printf("\t**After StrCopy**\n");
printf("copy T to V\n");
printf("V: ");
StrCopy(T,V);
StrTraverse(V);
printf("\t**After StrEmpty**\n");
int j = StrEmpty(W);
if(j == 1)
printf("W is empty!\n");
else
printf("W isn't empty!\n");
printf("\t**After StrCompare**\n");
int k = StrCompare(S,T);
if(k == 0)
printf("they have same length!\n");
if(k > 0)
printf("S is longer!\n");
if(k < 0)
printf("T is longer!\n");
printf("\t**After StrConcat**\n");
StrConcat(W,S,T);
printf("W: ");
StrTraverse(W);
printf("\t**After SubString**\n");
printf("from W situation 4,lengh is 5's SubString is: ");
SubString(V,W,4,5);
printf("V: ");
StrTraverse(V);
printf("\t**After Index**\n");
int ANSWER = Index(S,T,1);
printf("find substring in main String's situation = %d\n", ANSWER);
printf("\t**After Replace**\n");
Replace(S,T,Q);
printf("S: ");
StrTraverse(S);
printf("\t**After StrInsert**\n");
StrInsert(T,1,Q);
printf("T: ");
StrTraverse(T);
printf("\t**After StrDelete**\n");
StrDelete(T,1,3);
printf("T: ");
StrTraverse(T);
return 0;
}