目录
2.1 字符串逆置、通过递归实现逆置、字符串连接、字符串比较函数、字符串拷贝、字符串长度
一、思维导图
二、作业
通过“多文件编辑”实现
三个文件: main.c head.h test.c
2.1 字符串逆置、通过递归实现逆置、字符串连接、字符串比较函数、字符串拷贝、字符串长度
代码:
main.c
#include "head.h"
#include <stdio.h>
int main(int argc, const char *argv[])
{
char a[20]={"asdfghjk"};
char b[30]={"hello"};
char c[]={"12345"};
char d[20]={"yuio"};
char e[]={"98765"};
MyStrRev(a);
StrRevRec(b,strlen(b));
printf("\n");
char *num=MyStrcat(b,c);
printf("%s\n",num);
MyStrcmp(a,b);
char *num1=MyStrcpy(d,e);
printf("%s\n",num1);
int num2=Mystrlen(a);
printf("%d\n",num2);
return 0;
}
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
void MyStrRev(char *p);
void StrRevRec(char a[],int len);
char *MyStrcat(char *dest,const char *src);
int MyStrcmp(const char *s1,const char *s2);
char *MyStrcpy(char *dest,const char *sec);
long Mystrlen(const char *s1);
#endif
test.c
#include "head.h"
//1>通过指针指向字符串,实现字符串逆置
void MyStrRev(char *p)
{
char t=0;
int i=0,j=Mystrlen(p)-1;
while((p+i)<(p+j))
{
t=*(p+i);
*(p+i)=*(p+j);
*(p+j)=t;
i++;j--;
}
puts(p);
}
//2>通过递归实现字符串逆置
void StrRevRec(char a[],int len)
{
if(len==1)
{
printf("%c",a[len-1]);
}
else
{
printf("%c",a[len-1]);
StrRevRec(a,len-1);
}
}
//3>字符串连接
char *MyStrcat(char *dest,const char *src)
{
char *p=dest;
while(*dest)
{
dest++;
}
while(*src)
{
*dest = *src;
dest++;src++;
}
*dest='\0';
return p;
}
//4>字符串比较函数
int MyStrcmp(const char *s1,const char *s2)
{
int i=0,cha;
while(*(s1+i)==*(s2+i))
{
if(*(s1+i)=='\0'&&*(s2+i)=='\0')
{
break;
}
else
{
i++;
}
}
cha=*(s1+i)-*(s2+i);
if(cha>0)
printf("字符串1>字符串2\n");
else if(cha=0)
printf("两个字符串长度相等\n");
else
printf("字符串1<字符串2\n");
}
//5>字符串拷贝
char *MyStrcpy(char *n1,const char *n2)
{
char *p=n1;
while(*n2)
{
*n1=*n2;
n1++;n2++;
}
*n1='\0';
return p;
}
//6>字符串长度
long Mystrlen(const char *s1)
{
long count=0;
while(*s1)
{
count++;
s1++;
}
return count;
}
输出:
char a[20]={"asdfghjk"};
char b[30]={"hello"};
char c[]={"12345"};
char d[20]={"yuio"};
char e[]={"98765"};
1、调用函数:MyStrRev(a);
输出:kjhgfdsa
2、调用函数:StrRevRec(b,strlen(b));
printf("\n");
输出:olleh
3、调用函数:char *num=MyStrcat(b,c);
printf("%s\n",num);
输出:12345
4、调用函数:MyStrcmp(a,b);
输出:字符串1>字符串2
5、调用函数:char *num1=MyStrcpy(d,e);
printf("%s\n",num1);
输出:98765
6、调用函数:int num2=Mystrlen(a);
printf("%d\n",num2);
输出:8
return 0;
}
2.2 实现字符串移动
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
void Sort(char *p,int n);
char *DaXie(char *p,int n);
char *ShuZi(char *p,int n);
char *XiaoXie(char *p,int n);
char *TeShu(char *p,int n);
#endif
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
char str[]="AGAB%Sr67gs5ffwt+%";
int n=strlen(str);
Sort(str,n);
printf("%s\n",str);
char *p[4]={DaXie(str,n),ShuZi(str,n),XiaoXie(str,n),TeShu(str,n)};
char t[100];
for(int i=0;i<4;i++)
{
strcat(t,p[i]);
}
puts(t);
return 0;
}
test.c
#include "head.h"
//1.1 先对字符串实现升序排序
void Sort(char *p,int n)
{
int i,j;
char t;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
if(*(p+j)>*(p+j+1))
{
t=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=t;
}
}
}
}
//1.2 从字符串中挑出大写
char *DaXie(char *p,int n)
{
static char px[20]="";
static char *q=px;
int i=0,j=0;
while(*(p+i))
{
if(*(p+i)>='A'&&*(p+i)<='Z')
{
*(q+j)=*(p+i);
j++;
}
i++;
}
*(q+j)='\0';
return q;
}
//1.3 从字符串中挑出数字
char *ShuZi(char *p,int n)
{
static char px[20]="";
static char *q=px;
int i=0,j=0;
while(*(p+i))
{
if(*(p+i)>='0'&&*(p+i)<='9')
{
*(q+j)=*(p+i);
j++;
}
i++;
}
*(q+j)='\0';
return q;
}
//1.4 从字符串中挑出小写
char *XiaoXie(char *p,int n)
{
static char px[20]="";
static char *q=px;
int i=0,j=0;
while(*(p+i))
{
if(*(p+i)>='a'&&*(p+i)<='z')
{
*(q+j)=*(p+i);
j++;
}
i++;
}
*(q+j)='\0';
return q;
}
//1.5 从字符串中挑出特殊字符
char *TeShu(char *p,int n)
{
static char px[20]="";
static char *q=px;
int i=0,j=0;
while(*(p+i))
{
if(!((*(p+i)>='A'&&*(p+i)<='Z')||(*(p+i)>='0'&&*(p+i)<='9')||(*(p+i)>='a'&&*(p+i)<='z')))
{
*(q+j)=*(p+i);
j++;
}
i++;
}
*(q+j)='\0';
return q;
}
//1.7 按照顺序,实现字符串连接【使用strcat就行,或者调用自己封装的函数】
输出:
2.3 判断二维字符数组是否存在“回文字符串”
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
int LoopStr(char str[] [10],int n);
int HuiWen(char *p);
#endif
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
char a[][10]={"asd","asa","werew","yuyu"};
int n=sizeof(a)/sizeof(a[0]);
int num=LoopStr(a,n);
if(num==1)
printf("是回文字符串\n");
else
printf("不是回文字符串\n");
return 0;
}
test.c
#include "head.h"
//2.1 循环二维数组,存在回文返回1,否则返回0
int LoopStr(char str[] [10],int n)
{
int i;
for (i=0;i<n;i++)
{
int num=HuiWen(str[i]);
if(num==1)
return 1;
}
return 0;
}
//2.2 回文字符串函数,是回文返回1,否则返回0
int HuiWen(char *p)
{
char *q=p;
int i=0,j=strlen(p-1);
char t;
while(i<j)
{
if(*(q+i)!=*(p+i))
return 0;
else
{
i++;
j--;
}
}
return 1;
}
输出:
2.4 斐波那契数列
head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
void Fibonacii();
void FibonaciiArr();
int FibonaciiRec(int n);
#endif
main.c
#include "head.h"
int main(int argc, const char *argv[])
{
Fibonacii();
printf("\n");
FibonaciiArr();
printf("\n");
int num;
for(int i=1;i<=10;i++)
{
num=FibonaciiRec(i);
printf("%d\t",num);
}
printf("\n");
return 0;
}
test.c
#include "head.h"
void Fibonacii()
{
int i,a=1,b=1,c,n=10;
printf("%d\t%d\t",a,b);
for(i=3;i<=n;i++)
{
c=a+b;
a=b;
b=c;
printf("%d\t",c);
}
printf("\n");
}
void FibonaciiArr()
{
int n=10,i;
int a[20]={1,1};
printf("%d\t%d\t",a[0],a[1]);
for(i=2;i<n;i++)
{
a[i]=a[i-1]+a[i-2];
printf("%d\t",a[i]);
}
printf("\n");
}
int FibonaciiRec(int n)
{
if(n==1||n==2)
{return 1;}
else
{
return FibonaciiRec(n-1)+FibonaciiRec(n-2);
}
}