问答题 编写函数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; }
【答案解析】