子串在主串中的位置
假设主串 str1=string.LastIndexOf,子串str2=Index。我们要寻找str2在str1中的首个出现位置。
1.设i用于主串str1中当前位置下标值,j用于子串str2中当前位置下标值。
2.首先我们比较str1[1]与str2[1],如果相同的话,可能子串就开始了。
3.如果不相等,那么子串仍然是从str2[1]开始,而主串str1则以str1[2]与其比较。即i退回到上次匹配首位的下一位
4.如果连续出现strlen(str2)次或以上匹配,那么就找到子串了,此时的j必然等于子串长度strlen(str2)。
#include<stdio.h>
#define MAXSIZE 30
#include<string.h>
int FindSubIndex(char str1[],char str2[])
{
int i,j; // j用于子串T中当前位置下标值
i = 0;j = 0; // i用于主串S中当前位置下标值
while(i < strlen(str1) && j < strlen(str2))
{
if(str1[i] == str2[j])
{
++i;
++j;
}
else
{
j = 0; //j退回到子串T的首位
i = i - j + 1; // i退回到上次匹配首位的下一位
}
}
if(j==strlen(str2))
{
return i - strlen(str2) + 1;
}
else
{
return 0;
}
}
int main()
{
int Index = 0;
char str1[MAXSIZE];
char str2[MAXSIZE];
//puts(str1);
//puts(str2);
printf("主串str1为: ");
scanf("%s",str1);
printf("子串str2为: ");
scanf("%s",str2);
Index = FindSubIndex(str1,str2);
printf("str1的第%d个字母起和str2第一次匹配\n",Index);
return 0;
}
/*
主串str1为: string.LastIndexOf
子串str2为: Index
str1的第12个字母起和str2第一次匹配
#define MAXSIZE 30
#include<string.h>
int FindSubIndex(char str1[],char str2[])
{
int i,j; // j用于子串T中当前位置下标值
i = 0;j = 0; // i用于主串S中当前位置下标值
while(i < strlen(str1) && j < strlen(str2))
{
if(str1[i] == str2[j])
{
++i;
++j;
}
else
{
j = 0; //j退回到子串T的首位
i = i - j + 1; // i退回到上次匹配首位的下一位
}
}
if(j==strlen(str2))
{
return i - strlen(str2) + 1;
}
else
{
return 0;
}
}
int main()
{
int Index = 0;
char str1[MAXSIZE];
char str2[MAXSIZE];
//puts(str1);
//puts(str2);
printf("主串str1为: ");
scanf("%s",str1);
printf("子串str2为: ");
scanf("%s",str2);
Index = FindSubIndex(str1,str2);
printf("str1的第%d个字母起和str2第一次匹配\n",Index);
return 0;
}
/*
主串str1为: string.LastIndexOf
子串str2为: Index
str1的第12个字母起和str2第一次匹配
请按任意键继续. . .*/