Bootstrap

C语言数据结构学习:字符串暴力匹配

C语言 数据结构学习 汇总入口:

C语言数据结构学习:[汇总]

一、简单说明

  • 作用

    在一个比较长的主字符串里面,找找有没有我们指定的子字符串。

  • 暴力匹配时指针的作用

    指针时用来指向主串和子串在计算机内存里存放的起始位置。

  • 具体匹配过程 从主串和子串开头的位置开始,也就是指针指向的地方,一个字符一个字符地往后比对。要是比对的时候发现有字符不一样了,那说明这次比对不成功,这时候呢,就让指向主串的起指针回到起始位置,但是向后加1,然后继续匹配。就这样,不断重复这个过程,一直到主串或者子串的指针有一个指向了字符串最后的结束标志(也就是 '\0' 这个字符,表示都已经指到了字符串结束位置了)为止。 最后再通过判断 子字串的指针是否指到了最后的\0 ,如果为1 那么就匹配成功了。

二、程序大纲

  • 初始化字符串
  • 字符串赋值函数
  • 打印字符串
  • 字符串暴力匹配函数

三、程序

//初始化String
String* InitString() {
	String* s = (String*)malloc(sizeof(String));//初始化String空间
	s->data = NULL;
	s->len = 0;
	return s;
}

//给字符串赋值的函数
void StringAssign(String* s, char* data) {
	if (s->data) { //释放data的数据
		free(s->data);
	}
	int len = 0;
	char* temp = data;
	while (*temp) {	//求字符串长度
		len++;
		temp++;
	}
	if (len == 0) {
		s->data = NULL;
		s->len = 0;
	}
	else {
		temp = data;
		s->len = len;
		//开辟len+1的空间,  +1 是为了保存\\0
		s->data = (char*)malloc(sizeof(char) * (len + 1));
		//逐字保存
		for (int i = 0; i <= len; i++, temp++){
			s->data[i] = *temp;
		}
	}
}

//暴力匹配
void forceMatch(String* master, String* sub) {
	int i = 0;	//指向主串
	int j = 0;	//指向子串
	while (i < master->len && j < sub->len) {
		if (master->data[i] == sub->data[j]) {
			i++;
			j++;
		}
		else {	//不相等, 回溯
			i = i - j + 1;
			j = 0;
		}
	}
	if (j == sub->len) {//匹配成功
		printf("force match success.\\n");
	}
	else {//匹配不成功
		printf("force match fail.\\n");
	}
}

void printString(String* s) {

	//输出字符串中的数据
	for (int i = 0; i <= s->len; i++) {
		printf(i == 0 ? "%c " : "-> %c", s->data[i]);
	}
	printf("\\n");
}

//测试程序
int main(void) {
	String* s = InitString();
	String* s1= InitString();
	StringAssign(s, "HELLO WORLD");
	StringAssign(s1, "HEL");
	printString(s);
	printString(s1);
	forceMatch(s, s1);
	printf("Hello World");
	return 0;
}

;