应用题
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中出现的次数。