请详细解释此题的findstr函数
发布网友
发布时间:2022-05-15 10:07
我来回答
共1个回答
热心网友
时间:2023-10-19 19:06
#include <stdio.h>
#include <string.h>
#include <conio.h>
int findStr(char *str, char *substr)
{
int n;//用来保存原串包含子串的个数
char *p,*r;
n=0;
while(*str)//在原串未结束时循环
{
p=str;//p指向原串
r=substr;//r指向子串
while(*r)//子串未结束时循环
{
if(*r==*p)//原串一个字符与子串一个字符相等指针向后移,继续比较下一个字符
{
r++;p++;
}
else//不等则结束该while(*r)循环
{
break;
}
}
if(*r=='\0')//子串结束前都与原串相等说明原串包含子串一次,n要加1
n++;
str++;//比较一次原串后移一位,最后遇‘/0’
}
return n;//返回原串包含子串的个数//继续判断循环while(*str)条件,‘/0’ASCII码为0,跳出循环,函数结束
}
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(str, 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;
printf("输入原字符串:");
gets(str);
printf("输入子字符串:");
gets(substr);
puts(str);
puts(substr);
n = findStr(str, substr);
printf("n=%d\n", n);
ReadWrite();
}
比如你输入:
原串:
nihaonihaonihao
子串:
hao
第一次str是这个串首地址,*str指向第一个字符n
str++后*str指向第二个字符i
当然p是ihaonihaonihao的首地址,*p就指向字符i
r不变,是hao的首地址,*r指向字符h
每次移一个字符,最后*str会指向‘/0’循环结束
你可以上机设断点,单步调试一下看看变量的变化就明白了