1)串的基本操作

#include <stdio.h>
#define MaxSize 255
typedef struct 
{
    char ch[MaxSize];
    int len;
}MyString;
//从指定位序开始截取串的子串
bool SubString(MyString &Sub,MyString S,int pos,int len)
{
    if(pos+len-1>S.len) return false; //子串范围越界
    for(int i=pos;i<pos+len;i++)
    {
        Sub.ch[i-pos+1]=S.ch[i];
    }
    Sub.len=len;
    return true;
}
//比较两个串的大小
int CompareString(MyString S1,MyString S2)
{
    //逐个字符比较
    for(int i=1;i<=S1.len&&i<=S2.len;i++)
    {
        if(S1.ch[i]!=S2.ch[i]) return S1.ch[i]-S2.ch[i];    
    }
    //扫描过的字符皆相同,比较两字符串长度
    return S1.len-S2.len;
}
//定位子串
int indexString(MyString S,MyString Sub)
{
    //暂存截取串
    int i=1;
    MyString temp;
    temp.len=Sub.len;
    while(i<=S.len-Sub.len+1)
    {
        SubString(temp,S,i,Sub.len);
        if(CompareString(Sub,temp)!=0) ++i;
        else return i;
    }
    return 0;
}
//串的基本操作
int main(void)
{
    MyString S1;
    S1.ch[0]=NULL;
    S1.ch[1]='w';
    S1.ch[2]='z';
    S1.len=2;
    MyString S2;
    S2.ch[0]=NULL;
    S2.ch[1]='z';
    S2.len=1;
    printf("%d\n",indexString(S1,S2));
    return 0;
}

2)串的朴素模式匹配算法

//串的朴素模式匹配算法
int Index(MyString S,MyString Sub)
{
    int i,j,k;//k用于定位S当前匹配到哪个位置,i,j分别用于S与Sub的活动定位
    k=1;
    i=k;
    j=1;
    while(S.len-k+1<=Sub.len)
    {
        if(S.ch[i]==Sub.ch[j])
        {
            ++i;
            ++j;
        }
        else
        {
            j=1;
            ++k;
            i=k;
        }
        if(j>Sub.len) return k;
        else return 0;
    }
}