问题 问答题

编写一个函数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)


main()

char str[81],substr[3];
int n;
clrscr();
printf("输入原字符串");
gets(str) ;
printf("输入子字符串:");
gets(substr);
puts(str);
puts(substr);
n=findStr(str, substr);
printf("n=%d\n", n);
ReadWrite();

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<25)

fgets(str, 80, rf);
fgets(substr, 10, rf);
len=strlen(substr)-1;
ch=substr[len];
if(ch==’\n’ || ch==0xla)substr[len]=0;
n=findStr(str, substr);
fprintf(wf, "%dkn", n);
i++;

fclose(rf);
fclose(wf);

答案

参考答案:

int findStr(char *str,char *substr)

{

int n;

char *p , *r;

n=0;

while( *str )

{

p=str;

r=substr;

while(*r)

if(*r==*p)

{

r++; p++;

}

else

break;

if(*r==’\O’)

n++;

str++;

}

return n;

}

解析:

该程序属于按条件查找类型的题目,考核的知识点为:

(1)在给定的字符串中查找指定字符;

(2)统计查找后满足条件的个数。

本题的解题思路是:对原字符串中的字符进行扫描,若原字符串中含有子字符串,即原字符串的其中一部分与子字符串完全相同时,统计出个数。判断原字符串是否含有子字符串,可以将原字符串中的元素逐个与子字符串相比较,当两字符串中各个元素都相同且子字符串结束时,则证明原字符串包含一个子字符串。在统计个数的时候需要设置一个记录变量,每当原字符串包含子字符串一次的时候,该记录变量自动加1。

程序的流程是:首先通过键盘接收两个字符串,其中一个作为原字符串,另一个作为子字符串,然后调用findStr()函数对两字符串进行比较,处理后的结果由ReadWrite()函数写回文件out.dat中。

答案解析如下:

int findStr(char *str,char *substr)

{

int n; /*定义变量,n代表子符串出现次数*/

char p,r; /*定义指针变量*/

n=0;

while(str)

/*当原字符串不为空,即*str不为空时进入到外层while,此时循环中原字符串指针str和子字符串指针substr都指向其字符串内的第一个元素*/

{

p=str; /*将字符串的指针str赋给p*/

r=substr; /*将字符串的指针substr赋给r*/

while(*r) /*当子字符串也不为空时,即*r不空时进入内嵌的while循环*/

if(*r==*p) /*将原字符串与子字符串逐个元素进行比较看是否相等*/

{

r++;

p++;

}

/*将原字符串与子字符串分别后移一个字符*/

else

break; /*否则结束循环*/

if(*r==’\0’) /*结束while循环的情况有两种:(1)比较完毕,即原字符串中包含该子字符串,此时子字符串的指针指向串尾(为“\0”);(2)未比较完毕,此时子字符串的指针不指向串尾。if语句的功能是通过判断子字符串的指针是否指向串尾进而来判断内层while循环结束的原因*/

n++; /*出现的次数加1*/

str++; /*牟字符串指针也指向下一个字符*/

}

return n; /*返回出现的次数*/

}

单项选择题
单项选择题