子串在主串中的位置

假设主串 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第一次匹配 ",Index);    
    return 0;
}
/*
主串str1为: string.LastIndexOf
子串str2为: Index
str1的第12个字母起和str2第一次匹配

请按任意键继续. . .*/ 

原文地址:https://www.cnblogs.com/lanshy/p/3431142.html