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;
}
出现的永远都是找不到这个子串,不知道是哪里出现了问题
也有一点,这个串的是从下标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
逻辑错误,Index函数的判断条件错误,应该是直接等于L.length
– 溯流 3个月前