字符串(C语言实现)——BF算法(暴力匹配)

#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;
}

猜你喜欢

转载自blog.csdn.net/Mr_Morgans/article/details/121197443