1、字符串分类函数
C语言有些函数,给字符进行分类,分大写、小写、数字;头文件#include<ctpye.h>
例如把小写字母变为大写字母,大写字母变为小写字母;
islower()判断是否为小写字母;是小写字母就返回非零的数,不是小写字母返回0;
isupper()判断是否为大写字母;是大写字母就返回非零的数,不是大写字母返回0;
是小写字母就-=32;是大写字母+=32;应为大小写字母相差32;
2、字符转换函数
将小写字母变为大写字母,把大写字母变为小写字母;
toupper()将小写字母转换为大写字母;
tolower()将大写字母转换为小写字母;
3、strlen的使用和模拟
strlen库函数是计算字符串的元素个数的;
参数是const 修饰的char* 的指针变量,返回类型是int
模拟strlen函数的逻辑
- strlen传的参数字符串的首元素的地址
- 根据首元素的地址往后遍历每个元素
- 直到遇到\0就停止
有三种方法:
1、计算个数
- 通过count变量计算 *str 的元素是否为\0
- 不为\0,count++,str++往后遍历
- 遇到\0,返回count
- const修饰str是因为只是计算字符串的元素个数,不想字符串被修改;
2、指针- 指针
得到的是元素个数
- assert(*str) 可以写成这样,如果*str为\0,\0等于0,为NULL,也会报错
- str1 记录首元素的地址
- str ++ 往后遍历字符,直到遇见\0;
- str - str1 两个地址相减得到是地址之间的元素个数,后面的地址比前面的地址要大,所以后面减去前面为整数,反之为负数;
3、递归
- 递归的核心思想就是大事化小,一个问题换成一个一个的子问题
- my_strlen取得是字符的个数,先把第一个字符取出来得到的个数就是1
- 1 + my_strlen("bcdef") 把一个一个问题拆分,不断取出一个个字符,不断+1
- 直到取到\0,加上0,开始回归
- 限制条件就是*str 等于\0 就开始回归
- 每次调用my_strlen(str+1),不断往后取字符,不断的不断逼近限制条件
- 慢慢理解,画图比较好


4、size_t
注意:strlen函数的返回类型是size_t
比如计算arr1和arr2的元素个数,正常情况下应该是arr2是3减去arr1是6,结果是小于0的数,打印的就是<
但是strlen返回的是size_t,是无符号整型;无符号整型减去无符号整型得到的还是无符号整型;

假设减去的结果是 -3 ;
-3 在内存中的补码是这样的;但是减去的类型是size_t无符号整型,就没有符号位了,符号位变为0,变成了无符号整数,无符号整数它的原码反码补码相同,是一个很大的数字,结果就是>。

注意strlen:
- 计算的是字符串开始,到字符串\0之前的元素个数
- \0是strlen函数的结束标志
- strlen函数的返回类型是size_t
- strlen是库函数,需要头文件
4、strcpy的使用和模拟
strcpy函数就是复制字符串 ; 头文件#include<string.h>
strcpy的参数
- char * destination 表示目的地的地址,你要复制到那个数组的首元素地址
- const char * source 表示源数据的地址,要复制的内容的数组首元素地址
- char* 表示返回类型

用strcpy复制arr的字符串到arr1上,最简单的就是把内容复制到arr1的数组名放到第一个参数,原有数据的数组放在第二个参数;

strcpy的实现
- 取得两个数组的首元素地址
- 把原有数据的数组一个一个遍历放到另一个数组中
- \0也要放到另一个数组中
自己实现的my_strcpy函数,返回类型是void是可以的,只是把一个数组的内容复制到另外一个数组那,后面再讲;先把两个数组的指针作为参数,assert断言两个都不是空指针,对原有数据的数组遍历一遍放到另一个数组中,直到遇见\0停止,循环结束后,两个数组的地址都指向了\0,最后再把\0放过去;


我们可以对代码再优化一下:
- assert断言可以把两个参数写在一起,如果两个其中有一个是NULL指针就会报错
- 原本是数组赋完值,地址++,其实是重复的,可以换成后置++;先使用赋值,赋值完再++
- 为什么*dest++=*arr++ 放在while循环里面呢?因为这个表达式就是赋值的结果,给的是'a',结果就是'a',如果一直加加,赋值,给的是'\0',那就循环结束了。
- strcpy的返回类型是char *,是因为复制完成后,返回的是dest的地址,也就是把内容复制到那个数组的数组,也就是arr1,复制完成,把地址给你传回来,给你看看;

返回的是地址,也可以用strlen计算一下字符的个数

注意strcpy
1、原数组必须要有'\0';如果没有\0,它会一直拷贝,因为它拷贝是到\0才会停止,会报错

2、拷贝数组,也会把\0拷贝下来
3、目标数组要有足够的空间,不然会越界访问

4、目标数组是可修改的空间;常量字符串是不能被修改的

5、strcat的使用和模拟
strcat函数就是追加字符串;
strcat的参数
跟strcpy是一样的

前面参数是目标数组,后面参数是要追加的字符串

strcat的实现
- 参数,返回类型跟strcpy是一样的
- strcat是追加字符串,是在目标数组的 \0 的位置开始追加字符串;
- 追加字符串就是把字符串拷贝到目标数组,跟strcpy是一样的
先把目标数组遍历到\0的位置,然后再复制内容拷贝到目标数组;

注意stycat
1、拷贝的内容必须要有 \0,因为拷贝的时候会把目标数组的\0覆盖掉了,拷贝内容有\0才不会越界访问
2、目标数组要有足够的空间;没有足够的空间;拷贝不进去会报错的
3、 目标数组也必须要有\0,才会直到要从那开始
4、目标数组必须是可修改的空间
那strcat能不能自己追加自己,答案是不行的;
因为追加是从\0的位置开始的,覆盖掉了\0,导致了本身没有\0了,所以会一直这样追加追加下去

感谢观看