#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
typedef struct
{
char * data; // 字符指针数组存储字符串
int len; // 记录字符串字符个数
}String;
String* Init_String(); // 初始化字符串结构体
void Assign_String(String * S, char * T); // 串赋值
bool Strcat_String(String * S, char * T); // 串连接
char* Strsub_String(String * S, int pos, int len); // 求子串
int Strcmp_String(String * S, char * T); // 串比较
int Strindex_String(String * S, char * T); // 子串定位
bool Insert__String(String * S, char * T, int pos);// 串插入
bool Delete_String(String * S, int pos, int len); // 串删除
int BF_Match(String * S, char * T); // 模式匹配,返回串T在串S中的位置
int Length_String(char * T); // 求串长度
bool Empty_String(char * T); // 判串是否为空
void Print_String(char * T); // 打印字符串
int main()
{
String * S = Init_String();
Assign_String(S, "Hello.");
printf("字符串S赋值成功!\n");
printf("字符串S:");
Print_String(S->data);
printf("\n\n");
if(Strcat_String(S, " How are you today?"))
{
printf("字符串S连接成功!\n");
printf("字符串S:");
Print_String(S->data);
printf("\n\n");
}
else
printf("字符串S连接失败!\n");
char * T1 = Strsub_String(S, 8, 3);
printf("字符串S的子串:");
Print_String(T1);
printf("\n");
printf("字符串S:");
Print_String(S->data);
printf("\n\n");
char * T2 = " I am fine.";
int n = Strcmp_String(S, T2);
printf("串S vs 串T2:");
if(n==0)
printf("S == T");
else if(n==1)
printf("S > T");
else if(n==-1)
printf("S < T");
printf("\n");
printf("字符串T2:");
Print_String(T2);
printf("\n");
printf("字符串S:");
Print_String(S->data);
printf("\n\n");
char * T3 = "today";
printf("串T3在串S的第%d个位置\n", Strindex_String(S, T3));
printf("字符串T3:");
Print_String(T3);
printf("\n");
printf("字符串S:");
Print_String(S->data);
printf("\n\n");
char * T4 = " I am fine.";
if(Insert__String(S, T4, 25))
printf("插入成功!\n");
else
printf("插入失败!\n");
printf("字符串T4:");
Print_String(T4);
printf("\n");
printf("字符串S:");
Print_String(S->data);
printf("\n\n");
if(Delete_String(S, 1, 7))
printf("删除成功!\n");
else
printf("删除失败!\n");
printf("字符串S:");
Print_String(S->data);
printf("\n\n");
char * T5 = "today" ;
int pos = BF_Match(S, T5);
printf("串T5在串S中的位置:%d\n",pos);
printf("字符串T5:");
Print_String(T5);
printf("\n");
printf("字符串S:");
Print_String(S->data);
printf("\n\n");
return 0;
}
String* Init_String()
{
String * S = (String*)malloc(sizeof(String)); // 为一个字符串结构体分配存储空间
if(!S)
exit(-1);
S->data = NULL;
S->len = 0;
return S;
}
void Assign_String(String * S, char * T)
{
if(S->data)
free(S->data);
/* 如果原字符串有内容,需要清空才能进行赋值 */
int len = Length_String(T);
if(len == 0)// 判断赋值的字符串是否是空串
{
S->data = NULL;
S->len = 0;
return;
}
else
{
int i;
S->data = (char*)malloc(sizeof(char)*(len+1));// 为存储字符串的字符指针数组分配存储空间
for(i=0; i<len; i++,T++)
{
S->data[i] = *T;
}
S->len = len;
return;
}
}
bool Strcat_String(String * S, char * T)
{
if(Empty_String(S->data))
return true;
int i;
int len = Length_String(T);
if(len == 0)
{
return false;
}
else
{
int n = S->len;
S->len += len;
S->data = (char*)realloc(S->data,sizeof(char)*(S->len+1));// 扩充字符指针数组空间
for(i=0; T[i]!='\0'; i++)
{
S->data[n++] = T[i];
}
S->data[n] = '\0';
return true;
}
}
char* Strsub_String(String * S, int pos, int len)
{
if(Empty_String(S->data))
return NULL;
if(len > S->len)
return NULL;
int i,j;
char * T = (char*)malloc(sizeof(char)*len+1);
for(i=pos-1,j=0; j<len; ++i,++j)
{
T[j] = S->data[i];
}
T[j] = '\0';
return T;
}
int Strcmp_String(String * S, char * T)
{
if(Empty_String(S->data))
return 0;
int i,j;
int len = Length_String(T);
for(i=0,j=0; (i<S->len&&j<len) || (S->data[i]!='\0'&&T[j]!='\0'); ++i, ++j)
{
if(S->data[i] == T[j])
continue;
else
break;
}
if(S->data[i] == T[j] && S->len == len)
return 0;
else if(S->len > len)
return 1;
else
return -1;
}
int Strindex_String(String * S, char * T)
{
int i;
for(i=0; i<S->len; ++i)
{
if(S->data[i] == *T)
{
return i+1;
}
}
return 0;
}
bool Insert__String(String * S, char * T, int pos)
{
if(Empty_String(S->data))
return false;
if(pos > S->len)
return false;
int i,j;
int len = Length_String(T);
for(i=S->len; i<pos-1; i--)// 把第 pos 个位置腾出空间
{
S->data[i+1] = S->data[i];
}
for(j=0; j<len; ++j)
{
S->data[i++] = T[j];
}
S->data[i] = '\0';
S->len += len;
return true;
}
bool Delete_String(String * S, int pos, int len)
{
if(Empty_String(S->data))
return false;
int i = pos-1;// 第pos个字符的下标
for( ; i+len<S->len && i<i+len; i++)
{
S->data[i] = S->data[i+len];
}
S->data[i] = '\0';
return true;
}
int BF_Match(String * S, char * T)
{
if(Empty_String(S->data))
return;
int i=0,j=0,start=0;
int len = Length_String(T);
while(i<S->len && j<len)// 利用while循环进行暴力匹配
{
if(S->data[i] == T[j])
{
i++;
j++;
}
else
{
start++;
i = i - j + 1;
j = 0;
}
}
if(j == len)
{
printf("Force Match is success.\n");
return start+1;
}
else
printf("Force Match is fail.\n");
}
int Length_String(char * T)
{
int len = 0;
while(*T)
{
len++;
T++;
}
return len;
}
bool Empty_String(char * T)
{
if(Length_String(T))
return false;
else
return true;
}
void Print_String(char * T)
{
if(Empty_String(T))
return;
int i;
int len = Length_String(T);
for(i=0; i<len; ++i)
{
printf("%c", T[i]);
}
return;
}
