c语言第九天

一、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. 只会初始化一次

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值