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