C语言 数据结构之 字符串暴力匹配

目录

什么是串 及其特点

初始化串

串赋值

打印

暴力匹配

主函数(验证)


什么是串 及其特点

串在一块连续的内存,在C语言中可以看成是一个字符数组;

结构体包含:1.数据域(字符串内容)

                      2.字符串长度

这里就不讲什么是暴力匹配了,用文字讲不太清楚,不懂的可以去找视频讲解

初始化串


typedef struct String {
    char* data;
    int lenth;
}String;

String* initString() {
    String* S = (String*)malloc(sizeof(String));
    S->data = NULL;
    S->lenth = 0;
    return S;
}

串赋值

void assignString(String* S,char* data) {
//先判断S是否为空
    //if (S->data)
    if(S->lenth == 0)
        free(S->data);
    int len =0;
    char* temp = data;
    while (*temp) {//当temp指向\0是结束循环
        len++;
        temp++;
    }
    if (len == 0) {
        S->data = NULL;
        S->lenth = 0;
    }
    else{

        //temp = data;
        S->data = (char*)malloc(sizeof(char)*(len + 1));
        //多一位用于保存字符串结尾\0
        S->lenth = len;
        for (int i = 0; i < len; i++) {
        S->data[i] = data[i];
        }
    }
}

打印

void printString(String* S) {
    for (int i = 0; i < S->lenth; i++) {
        printf(i == 0 ? "%c" : "->%c", S->data[i]);
    }
    printf("\n");
}

暴力匹配

void forcematch(String* S, String* sub) {
    int i = 0;//指向主串
    int j = 0;//指向子串
    while (i <= S->lenth && j <sub->lenth) {
        if (S->data[i] == sub->data[j]) {
            i++;
            j++;
        }
        else {//重置指针
            i = i - j + 1;
            j = 0;
        }
    }
    if (j == sub->lenth) {
        printf("force match success\n");
    }
    else
        printf("force match fail\n");
}

主函数(验证)

int main() {
    String* S = initString();
    String* sub = initString();
    assignString(S, "huang");
    printString(S);
    assignString(sub, "ang");
    printString(sub);
    forcematch(S, sub);
    return 0;
}

完整源代码

#include "headfile.h"
typedef struct String {
	char* data;
	int lenth;
}String;

String* initString() {
	String* S = (String*)malloc(sizeof(String));
	S->data = NULL;
	S->lenth = 0;
	return S;
}

void assignString(String* S,char* data) {
//先判断S是否为空
	//if (S->data)
	if(S->lenth == 0)
		free(S->data);
	int len =0;
	char* temp = data;
	while (*temp) {//当temp指向\0是结束循环
		len++;
		temp++;
	}
	if (len == 0) {
		S->data = NULL;
		S->lenth = 0;
	}
	else{

		//temp = data;
		S->data = (char*)malloc(sizeof(char)*(len + 1));
		//多一位用于保存字符串结尾\0
		S->lenth = len;
		for (int i = 0; i < len; i++) {
		S->data[i] = data[i];
		}
	}
}

void printString(String* S) {
	for (int i = 0; i < S->lenth; i++) {
		printf(i == 0 ? "%c" : "->%c", S->data[i]);
	}
	printf("\n");
}

void forcematch(String* S, String* sub) {
	int i = 0;//指向主串
	int j = 0;//指向子串
	while (i <= S->lenth && j <sub->lenth) {
		if (S->data[i] == sub->data[j]) {
			i++;
			j++;
		}
		else {//重置指针
			i = i - j + 1;
			j = 0;
		}
	}
	if (j == sub->lenth) {
		printf("force match success\n");
	}
	else
		printf("force match fail\n");
}

int main() {
	String* S = initString();
	String* sub = initString();
	assignString(S, "huang");
	printString(S);
	assignString(sub, "ang");
	printString(sub);
	forcematch(S, sub);
	return 0;
}

  • 35
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值