问答题
编写函数findStr(),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。例如,假定输入的字符串为"asd asasdfg asd as zx67 asd mklo",子字符串为"as",函数返回值为6。
函数ReadWrite()实现从in.dat文件中读取两个字符串,并调用函数findStr(),最后,把结果输出到out.dat文件中。
注意:部分程序已经给出。
请勿改动主函数main()和其他函数中的任何内容,仅在函数findStr()的花括号中填入你编写的若干语句。
#include <stdio.h>
#include <string.h>
#include <conio.h>
int findStr (char *str,char *substr)
{
}
void ReadWrite()
{
char str[81],substr[10],ch;
int n,len,i=0;
FILE *rf,*wf;
rf=fopen("in.dat","r");
wf=fopen("out.dat","w");
while(i<25)
{
fgets(strt 81,rf);
fgets(substr,10,rf);
len=strlen(substr)-1;
ch=substr[len];
if (ch=='/n'||ch==0x1a)
substr[len]=0;
n=findStr(str,substr);
fprintf(wf,"%d/n",n);
i++;
}
fclose(rf);
fclose(wf);
}
main ()
{
char str[81],substr[10];
int n;
gets(str);
gets(substr);
puts(str);
puts(substr);
n=findStr(str,substr);
printf("n=%d/n",n);
ReadWrite();
【正确答案】int findStr(char *str,char *substr)
{
int n;
char *p, *r;
n=0;
while(*str) /*以指针str循环遍历其所指字符串*/
{
p=str; /*用指针p指向当前字符*/
r=substr;
while(*r) /*以指针r循环遍历substr所指字符串*/
if(*r==*p)
{ /*如果p和r所指字符相同则继续比较*/
r++;
p++;
}
else
{ /*一旦碰到不同字符则跳出循环*/
break;
}
/*如果上面循环是正常结束(即r指向字符串结束标志'/0')*/
/*证明从str当前所指位置起与substr所指字符串中的所有字符一一匹配*/
if (*r=='/0')
n++; /*所以此时找到一个子串,计数值n增1*/
str++; /*将指向str移到下一个位置,继续遍历字符串*/
}
return n;
}
【答案解析】