1.编写一个程序,其中包含一个子函数,功能为统计一个字符串在另一个字符串中出现的次数。要求:
- 子函数形式为:int strat(char *a,char *sub);
运行结果示例:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int strat(char *a,char *b)
{
int i,j,m,n,k=0;//k代表小的字符串在大的字符串出现的总次数
m=strlen(a);//m,n用于测量循环的次数
n=strlen(b);
for(i=0;i<m-n;i++)//外循环执行m-n次(用数组平移的思路去理解)
{
if(*(a+i)==*b)//从头开始访问大的数组,如果找到了第一组个两个数组中对应重合的字母
{
for(j=0;j<n;j++)//接着向下判断
{
if(*(a+i+j)!=*(b+j))//如果有不完全重合的部分
{
break;//跳出循环
}
if(j=n-1)//如果已经到达了小数组的末尾
{
k++;//对于k累加
}
}
}
}
return k;//返回次数k
}
int main()
{
int i,j,n,k=0,t;
char a[100],b[10];
char *p=a,*q=b;//用指针访问数组时初始化的常见套路
printf("输入字符串1:");
gets(p);
printf("输入字符串2:");
gets(q);
p=a,q=b;//把两个指针向对应的数组的起始位置
t=strat( p, q);
printf("n=%d",t);
return 0;
}
2.编写一个程序,其中包含一个子函数,功能为比较两个字符串,将长的那个字符串的首地址作为子函数的返回值,然后在主函数中输出。要求:
- 子函数形式为:char *fun(char *s1,char *s2);
运行结果示例:
#include<stdio.h>
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
char *fun(char *s1,char *s2);
int main()
{
char s1[100],s2[100],s3[100],t;
char *p=s1,*q=s2;
cout<<"输入s1字符串:";
cin>>s1;
cout<<"输入s2字符串:";
cin>>s2;
printf("较长字符串为:%s\n",fun(p,q));
return 0;
}
char *fun(char *s1,char *s2)
{
int i,j;
for(i=0;*(s1+i)!='\0';i++)//双重循环,访问两个数组,由于不让用strlen,用s1和s2记下两个数组各自的长度
for(j=0;*(s2+j)!='\0';j++)
if(i-j<=0)//由于函数的返回值只能有一个
s1=s2;//如果第二个字符串长,那么把第二个字符串的地址传给第一个
return s1;//最后统一输出第一个字符串,即二者中较长的字符串
}
3.编写一个程序,其中包含一个子函数,功能为将字符串s2中所有未出现在s1中的字母添加到s1的末尾,然后输出。要求:
- 子函数形式为:char *addat(char *s1,char *s2);即:使用指针型函数的方式定义子函数,函数返回值为字符串s1的地址。
运行结果示例:
#include<stdio.h>
#include<string.h>
char *addat(char *s1,char *s2)
{
char *p;
while(*s2)//外循环是对于s2的条件判断,如果s2没有执行到最后一个字符,那么进行如下循环
{
p=s1//把指针p置初值,指向数组s1;
while(*p&&*p!=*s2)//如果p指针指向的部分不是s1的最后一个,并且p指向的字符s2里面没有,这个字符专属于s1
p++;//那么只需要指针下跳
if((p-s1)==strlen(s1))//如果执行了很久很久,直到p指针走完了s1
{
*p=*s2;//让p和当前的s2连起来
*(p+1)='\0';//最后一个字符置为‘\0’,新的字符串组成结束
}
s2++;//让s2指针下跳,判断下一个字母
}
return s1;
}
int main()
{
char s1[100],s2[80];
printf("输入字符串s1:");
gets(s1);
printf("输入字符串s2:");
gets(s2);
printf("结果:%s\n",addat(s1,s2));
return 0;
}