目录
什么是串 及其特点
串在一块连续的内存,在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;
}