一、string函数族:
#include <string.h>
strlen
功能:字符串中实际字符的个数
参数:字符串的首地址
返回值:字符的个数
strcpy
功能:对字符串进行复制
参数:1:char * 目标首地址复制的位置 2:char *源首地址复制的内容
返回值:目标首地址
char str[10]="hello";
char *m= strcpy((char *)malloc(20),"1234567");
printf("%s\n",m);
free(m);
m=NULL;
strncpy
功能:对字符串前n项进行复制
参数:1:char * 目标首地址 复制的位置 2:char *源首地址复制的内容3: intn:个数
返回值:目标首地址
char str[10]="hello";
char *m= strncpy((char *)malloc(20),"1234567",3);
printf("%s\n",m);
free(m);
m=NULL;
char str[10]="hello";
char *m= strcpy(str,"123");//123 \0
printf("%s\n",m);//123
// 使用strcpy复制内容 会复制到\0
for (int i = 0; i < 6; i++)
{
printf("%d\n",str[i]);//
}
注意:使用strcpy复制内容 会复制到\0
strcat
功能:对字符串拼接
参数:1:char * 目标首地址 拼接的字符串 2:char *源首地址 拼接的内容
返回值:目标首地址
char str[32] = "hello";
char str1[10] = "12345";
strcat(str, str1);
printf("%s\n",str);
strncat
功能:对字符串拼接
参数:1:char * 目标首地址拼接的字符串2:char *源首地址拼接的内容 3:个数
返回值:目标首地址
char str[32] = "hello";
char str1[10] = "12345";
strncat(str, str1,3);
printf("%s\n",str);
strcmp
功能:比较字符串的大小
参数:1:char * 目标首地址 s1 要比较的字符串 2:char *源首地址s2 要比较的字符串
返回值:
s1>s2: >0
s1=s2 : 0
s1<s2 : <0
char str[32] = "he";
char str1[10] = "za";
char *p = str1;
int a = strcmp(str, str1);
printf("%d\n", a);//-18
比较规则:
从字符串的首个字符开始比较ascii码值,比较相等继续向后,不等输出相减结果
strncmp
功能:比较字符串的大小
参数:1:char * 目标首地址s1要比较的字符串2:char *源首地址s2要比较的字符串3:个数
返回值:
s1>s2: >0
s1=s2 : 0
s1<s2 : <0
练习:
实现strcpy函数
二、递归函数
1. 定义:函数自己调用自己
2. 执行过程分为两个阶段
1) 递推阶段:从原问题出发,按递推公式从未知到已知,最终到达递归终止条件
2) 回归阶段:按递归的终止条件求出结果,逆向逐步带入递归公式,回到原问题
例:
1234
1:1234/1000%10--》/10/10/10
2: 1234/100%10----》1010
3: 1234/10%10---10
4: 1234%10
void fun(int a)
{
if (a > 9)
{
fun(a / 10);
}
printf("%d\n",a%10);
}
fun(12345);
练习:输出结果是:
int fun(int n)
{
if(n == 1)
return 1;
return n+fun(n-1);
}
int main()
{
printf("%d\n",fun(100));//5050
return 0;
}
结构体struct
1、定义
定义:用户自定义的数据类型,在结构体中可以包含若干不同数据类型的成员变量(也可以相同),使这些数据项组合起来反映某一个信息。
格式:
struct结构体名
{
数据类型成员变量1;
数据类型成员变量2;
数据类型成员变量3;
、、、、
};
struct demo
{
char name[32];
int age;
char b;
float c;
};
2.结构体变量:
概念:通过结构体类型定义的变量
格式:struct结构体名变量名;
struct demo ret;
定义结构体的同时定义变量
struct demo
{
char name[32];
int age;
char b;
float c;
}d1;
定义结构体时缺少名称的同时定义变量
struct
{
char name[32];
int age;
char b;
float c;
}d1,d2;
(1)赋值:
1. 通过大括号的方式赋值
struct demo ret={"kk",18,'a',1.22};
2. 定义之后赋值
struct demo ret;
ret.b = 'a';
ret.age=10;
3. 点等法
struct demo ret={
.c=1.99,
.b=10
};
(2)访问:
通过.(点)访问:结构体变量名.成员变量名
struct student stu;
scanf("%d%d%f",&stu.id,&stu.age,&stu.score) ;
printf("%d %d %f",stu.id,stu.age,stu.score);
重定义typedef
起别名
格式:typedef 旧名新名
typedefintsize_t
size_t--->int
1、 定义的同时重定义
typedef struct student
{
int id;
int age;
float score;
}STU;
int main(int argc, char const *argv[])
{
STU stu;//==== struct student stu
scanf("%d%d%f",&stu.id,&stu.age,&stu.score) ;
printf("%d %d %f",stu.id,stu.age,stu.score);
2. 定义完成结构体后重定义
typedef struct student STU;
STU stu; //==== struct student stu
scanf("%d%d%f", &stu.id, &stu.age, &stu.score);
printf("%d %d %f", stu.id, stu.age, stu.score);
练习:创建一个名为student的结构体,包含姓名,学号,班级,分数,(数据类型自己定义),从终端输入学生的信息并打印。
结构体数组
概念:使用结构体定义的数组
格式:
1.同时
struct student
{
int id;
int age;
float score;
char name[32];
}s1[3];
2.分开
typedef struct student STU;
STU s1[3];
赋值:
1.同时
struct student
{
int id;
int age;
} s2[3] = {
{10, 11},
{12, 1},
{1, 2}};
2.分开
typedef struct student STU;
STU s1[3];
s1[0].id = 10;
s1[0].age = 20;
s2[0].id = 11;
s2[1].id = 20;
遍历结构体数组
typedef struct student STU;
STU s1[3];
for (int i = 0; i < 3; i++)
{
//输入
scanf("%d%d",&s1[i].id,&s1[i].age);
}
for (int i = 0; i < 3; i++)
{
//输出
printf("%d %d\n",s1[i].id,s1[i].age);
}
结构体大小
按照字节对齐原则开辟,64位和8进行比较,用成员变量中最大的数据类型进行比较,<8:按照小的开辟>8:按照8开辟
struct student
{
short a; // 4 2
int id; // 4
short b; // 4
};
int main(int argc, char const *argv[])
{
printf("%d\n", sizeof(struct student)); // 12
结构体指针
概念:结构体类型的指针
定义:
struct结构体名*指针变量名
struct student *p=&stu;
赋值:
格式:指针变量名->成员变量名
struct student *p=&stu;
p->a=20;
p->id=10;
strcpy(p->name,"1234567");
struct student *p=&stu;
(*p).id=10;
结构体指针的大小:8字节
总结:
1. 不能把结构体类型变量作为整体引用,只能对结构体类型变量中的各个成员变量分别引用
即:stu.id可以输出 直接输出stu不行 stu整体不行必须具体到每一个成员变量
2. 如果成员变量本身属于另一种结构体类型,用若干个成员运算符一级级找到最低级的成员变量
3. 可以把成员变量当成普通变量运算(++ --都可以)
4. 结构体变量可以相互赋值
5. 结构体定义时尽可能压缩,减少空间浪费
共用体:
不同类型的成员变量共用同一块地址空间 使用union
union共用体名
{
成员变量;
成员变量;
}
union demo
{
int a;
char b;
};
int main(int argc, char const *argv[])
{
union demo d1;
d1.a=10;
d1.b='a';
printf("%d\n",d1.a);//97
union demo
{
int a;
char b;
};
int main(int argc, char const *argv[])
{
union demo d1;
d1.a=0x12345678;
printf("%#x\n",d1.b);//0x78
3. 特性:
1)共用体成员共用同一块地址空间
2)赋值顺序以最后一次赋值为准
3) 共用体的大小为成员中类型最大的数据的大小
枚举:
1.定义:用户自定义数据类型,可以用于声明一组常数
格式:enum
enum枚举名
{
标识符1=1,
标识符2=2,
};
staticextern
static:静态
修饰变量或者修饰函数
修饰变量:
1. 变量的存储位置改为全局区
2. 生命周期是整个程序
3. 只会初始化一次