1.核心算法:字符串的包含判断

int cheak(char *a,char *b)//从b中找a
{
    int la,lb,i,j,flag,sum=0;
    la=strlen(a);
    lb=strlen(b);
    for(i=0;i<=lb-la;i++)//遍历i遍
    {
        flag=1;
        j=0;
        while(j<la)//j表示a的第j个字符
        {
            if(a[j]!=b[i+j]){flag=0;break;}
            j++;
        }
        if(flag) sum++;
    }
    return sum;
}

其中a[j]!=b[i+j]的解释如下:
假设a:"ab",b:"aabc"
若a在b中出现过,则a中的每一个元素(a[j])都能在b中找到连续对应关系(b[i+j]),找不到就跳过。
(这个可能不太好理解,我们还是用实例来说明)
i j a[j] b[i+j] flag sum
0 0 a a 1 0
0 1 b a 0 0
1 0 a a 1 0
1 1 b b 1 1
2 0 a b 0 1
2 1 b c 0 1
循环结束。
再次着眼于代码中的几个关键点:
(1)lb-la
遍历次数的问题,在纸上写两个字符串画个圈圈就解决了。
(2)a[j]!=b[i+j]
i+j其实就是将b[j]往后推移i位(这应该是lb-la的正经解释)。 通俗说,就是将a向后“推刻度”,然后判断是否与b相配。
提一句if(flag)与if(flag!=0)等价,代表逻辑为真。
2.关于字符串数组的一点基础知识
字符串数组可以看作二维字符数组,两个“维”分别是字符串个数和每个字符串的最大长度。
由于题目中有这方面的规定,所以用二维数组可以保证不出现段错误。
而与此对应的指针数组,则有着节省空间的优点。