应用题 2.  编写一个函数findStr(char *str,char*substr),该函数统计一个长度为2的子字符串substr在另一个字符串str中出现的次数,该次数作为函数值返回。
    例如,假定输入的字符串为"asd asasdfg asd as zx67 asd mklo",子字符串为"as",函数返回值是6。
    函数ReadWrite()实现从文件in.dat中读取两个字符串,并调用函数findStr(),最后把结果输出到文件out.dat中。
    请勿改动主函数main()和其他函数中的任何内容,仅在函数findStr()的花括号中填入你编写的若干语句。
    #include <stdio.h>
    #include <string.h>
    void ReadWrite();
    int findStr(char *str, char *substr)
    {
    }
    main ()
    {
    char str[81], substr[3];
    int n;
    printf ("输入到原字符串:");
    gets(str);
    printf ("输入子字符串:");
    gets(substr);
    puts (str);
    puts (substr);
    n=findStr(str, substr);
    printf("n=%d\n", n);
    ReadWrite ();
    }
    /*从文件in.dat中读取两个字符串,并调用函数findStr(),最后把结果输出到文件out.dat中*/
    void ReadWrite()
    {
    char str[81], substr[3], ch;
    int n, len, i=0;
    FILE  *rf, *wf;
    rf=fopen("in.dat", "r");
    wf=fopen("out.dat", "w");
    while(i<5)
    {
    fgets (str, 80, rf);      //从文件in.dat中读取长度为79的字符串存入到字符串str
    fgets (substr, 10, rf);    //从文件in.dat中读取长度为9的子字符串存入到字符串substr
    len=strlen (substr)-1;    //把子字符串substr的长度减1的值赋给len
    ch=substr [len];        //把子字符串的最后一个字符的值赋给字符ch
    if(ch == '\n' || ch == 0x1a)
    substr[len]=0;
    /*调用函数findStr(str, substr)返回子字符串substr在字符串str中出现的次数*/
    n=findStr(str, substr);
    fprintf (wf, "%d\n", n);  //把计算结果n写入到文件out.dat
    i++;                        //循环变量i加1
    }
    fclose(rf);
    fclose(wf);
    }
【正确答案】char *p,*q=str;int cnt=0;
   while(1)
   {
   /*调用C语言的字符串库函数strstr(),返回子字符substr在字符串str中第一次出现的位置*/
   p=strstr(q,substr);
   if(p==NULL)
   break;  //如果p的值为空,则说明在字符串str没有找到子字符串,退出循环
   cnt++;  //否则,统计变量cnt加1
   /*指针q指向子字符串substr在字符串str中出现位置的后2个位置的子串*/
   q=p+2;
   }
   return cnt;  //返回子字符串substr在字符串str中出现的次数
【答案解析】 统计一个长度为2的子字符串在另一个字符串中出现的次数。
   ①定义字符指针p,q,并且q指向字符串str。定义计数整型变量cnt,设置其值等于0。
   ②在while循环中调用C语言的字符串库函数strstr(),返回子字符串substr在字符串q第一次出现的位置,赋给变量p。用if语句判断,如果p的值为空,则说明在字符串str没有找到子字符串,退出循环。否则,变量cnt加1,再把p的值加2(因为子字符串substr的长度为2)赋给变量q,执行下一次循环。直到字符串中不存在子字符串时,退出循环结束。
   ③最后,返回子字符串substr在字符串str中出现的次数。