首页 新闻 会员 周边 捐助

串的朴素匹配问题,C语言

0
悬赏园豆:5 [已关闭问题] 关闭于 2024-09-18 22:17

include<stdio.h>

include<stdlib.h>//声明内存的函数在这里

include<string.h>

typedef struct {
char* str;
int length;
}String;
String* init_string(void)
{
String L = (String)malloc(sizeof(String));
L->str= NULL;
L->length = 0;
return L;

}
int SubString(String* L, String S, int pos, int len)//求子串,用L返回子串从pos这个位置,选len长度的子串S
{
if (S.length < pos + len - 1||pos<0||len<0)
{
printf("子串出现错误");
return 0;
}
else
{
L->str = (char
)malloc((len + 1) * sizeof(char)); // +1 是为了存放末尾的 '\0'
for (int i = pos; i < pos + len; i++)
{
L->str[i-pos] = S.str[i];
}
L->str[len]='\0';
L->length = len;
}
return 1;
}

int Index(String S, String L)//S是主串,L是子串
{
int i = 0, j = 0;
while (i <=S.length && j <=L.length)
{
if (S.str[i] == L.str[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j >L.length)
{
printf("找到子串首个位置:%d",i-j+1);
return i - j + 1;

}
else
{
	printf("没找到!!!");
	return 0;
}

}

int main(void)
{

String *S=init_string();
String *L=init_string();

char* ch = "hello-world";
S->str = (char*)malloc(sizeof(char)*(strlen(ch)+1));

strcpy_s(S->str,strlen(ch)+1, ch);//进行安全的输入;
S->length = strlen(ch) + 1;//没有设置S的长度,导致SubString函数运行不了
SubString(L, *S, 1, 5);
printf("子串L:%s\n", L->str);
printf("主串S:%s\n", S->str);

Index(*S,*L);
free(S);
free(L);




return 0;

}

出现的永远都是找不到这个子串,不知道是哪里出现了问题

溯流的主页 溯流 | 菜鸟二级 | 园豆:207
提问于:2024-09-18 21:32

逻辑错误,Index函数的判断条件错误,应该是直接等于L.length

L.ength 会导致子串的结尾符号参加比较,导致永远匹配不成功

溯流 3个月前
< >
分享
所有回答(1)
0

也有一点,这个串的是从下标0开始存储的,导致
举例子
S:a a b c d \0
L: a b c \0

i=1 a j=0 a
i =2 b j=1 b
i =3 c j =2 c
i =4 d j= \0

溯流 | 园豆:207 (菜鸟二级) | 2024-09-18 22:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册