编写一个函数findStr(),该函数统计一个长度为2的子字符串在另一个字符串中出现的次数。例如,假定
编写一个函数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;/*返回出现的次数*/
}
茎叶图中的茎是指十位数,叶是指个为数,那如果茎中有两个数出现怎么计算,例如茎中是22,十位数只能是 数学 2020-05-13 …
maple13的运算结果中,有时会出现一个乘项"C1",这是什么东西?它出现在乘积式中,类似于一个 数学 2020-06-06 …
计算器上如果数字不够现实会出现数字前面或后面有个E字母,那前后出现E分别代表什么含义?例如我在某个 数学 2020-06-20 …
蒸馍时为什么出现个别的馍变成了死面一样的在农村称这种馍是鬼捏馍,有时一笼里能全部成这样,有时出现几 其他 2020-06-25 …
分式方程多个解分式方程会出现两个或多个解么?解法不同时可能出现多个解么?(包括增根)例如1/(x- 其他 2020-06-27 …
耶鲁大学公开课程(死亡),有些人说那卡根教授讲课有些啰嗦,一个单词重复出现,一个句子重复出现,一个 语文 2020-07-05 …
00000-9999910万个数字中像12345,54321,03259,65940等这样5个不同 数学 2020-07-19 …
用心做儿女请举个事例能体现父母的苦心的给些素材记叙文事例想不出什么事情能体现出父母的苦心并且要我们 语文 2020-07-24 …
c语言的一些小程序,要预编译头的,急急急!!!!题目一:描述输入n,判断从1到n之中,数字1一共要出 其他 2020-11-23 …
右上角出现一个小框,都是随机显示带小数点的数字,例10.38,3.17,怎么解决哦@右上角出现一个小 其他 2020-11-28 …