C语言>字符 (strlen) | 字符串函数(strcpy、strcat)

1、字符串分类函数

C语言有些函数,给字符进行分类,分大写、小写、数字;头文件#include<ctpye.h>

例如把小写字母变为大写字母,大写字母变为小写字母;

islower()判断是否为小写字母;是小写字母就返回非零的数,不是小写字母返回0;

isupper()判断是否为大写字母;是大写字母就返回非零的数,不是大写字母返回0;

是小写字母就-=32;是大写字母+=32;应为大小写字母相差32;

2、字符转换函数

将小写字母变为大写字母,把大写字母变为小写字母;

toupper()将小写字母转换为大写字母;

tolower()将大写字母转换为小写字母;

3、strlen的使用和模拟

strlen库函数是计算字符串的元素个数的;

参数是const 修饰的char* 的指针变量,返回类型是int

模拟strlen函数的逻辑

  1. strlen传的参数字符串的首元素的地址
  2. 根据首元素的地址往后遍历每个元素
  3. 直到遇到\0就停止

有三种方法:

1、计算个数

  1. 通过count变量计算 *str 的元素是否为\0
  2. 不为\0,count++,str++往后遍历
  3. 遇到\0,返回count
  4. const修饰str是因为只是计算字符串的元素个数,不想字符串被修改;

2、指针- 指针

得到的是元素个数

  1. assert(*str) 可以写成这样,如果*str为\0,\0等于0,为NULL,也会报错
  2. str1 记录首元素的地址
  3. str ++ 往后遍历字符,直到遇见\0;
  4. str - str1 两个地址相减得到是地址之间的元素个数,后面的地址比前面的地址要大,所以后面减去前面为整数,反之为负数;

3、递归

  1. 递归的核心思想就是大事化小,一个问题换成一个一个的子问题
  2. my_strlen取得是字符的个数,先把第一个字符取出来得到的个数就是1
  3. 1 + my_strlen("bcdef") 把一个一个问题拆分,不断取出一个个字符,不断+1
  4. 直到取到\0,加上0,开始回归
  5. 限制条件就是*str 等于\0 就开始回归
  6. 每次调用my_strlen(str+1),不断往后取字符,不断的不断逼近限制条件
  7. 慢慢理解,画图比较好

4、size_t

注意:strlen函数的返回类型是size_t

比如计算arr1和arr2的元素个数,正常情况下应该是arr2是3减去arr1是6,结果是小于0的数,打印的就是<

但是strlen返回的是size_t,是无符号整型;无符号整型减去无符号整型得到的还是无符号整型;

假设减去的结果是 -3 ;

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

注意strlen:

  1. 计算的是字符串开始,到字符串\0之前的元素个数
  2. \0是strlen函数的结束标志
  3. strlen函数的返回类型是size_t
  4. strlen是库函数,需要头文件

4、strcpy的使用和模拟

strcpy函数就是复制字符串 ; 头文件#include<string.h>

strcpy的参数

  1. char * destination 表示目的地的地址,你要复制到那个数组的首元素地址
  2. const char * source 表示源数据的地址,要复制的内容的数组首元素地址
  3. char* 表示返回类型

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

strcpy的实现

  1. 取得两个数组的首元素地址
  2. 把原有数据的数组一个一个遍历放到另一个数组中
  3. \0也要放到另一个数组中

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

我们可以对代码再优化一下:

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

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

注意strcpy

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

2、拷贝数组,也会把\0拷贝下来

3、目标数组要有足够的空间,不然会越界访问

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

5、strcat的使用和模拟

strcat函数就是追加字符串;

strcat的参数

跟strcpy是一样的

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

strcat的实现

  1. 参数,返回类型跟strcpy是一样的
  2. strcat是追加字符串,是在目标数组的 \0 的位置开始追加字符串;
  3. 追加字符串就是把字符串拷贝到目标数组,跟strcpy是一样的

先把目标数组遍历到\0的位置,然后再复制内容拷贝到目标数组;

注意stycat

1、拷贝的内容必须要有 \0,因为拷贝的时候会把目标数组的\0覆盖掉了,拷贝内容有\0才不会越界访问

2、目标数组要有足够的空间;没有足够的空间;拷贝不进去会报错的

3、 目标数组也必须要有\0,才会直到要从那开始

4、目标数组必须是可修改的空间

那strcat能不能自己追加自己,答案是不行的;

因为追加是从\0的位置开始的,覆盖掉了\0,导致了本身没有\0了,所以会一直这样追加追加下去

感谢观看

相关推荐
谈笑也风生4 小时前
经典算法题型之扫雷游戏(二)
c语言·游戏
进击的小头5 小时前
09_C 语言进阶之面向对象编程:跨平台设计 —— 从类型封装到工程实践
c语言
一路往蓝-Anbo5 小时前
【第14期】裸机中断优先级:抢占与嵌套的逻辑
c语言·开发语言·stm32·单片机·物联网
雅欣鱼子酱7 小时前
Type-C受电端芯片ECP5702演示:串口发送电压电流,给外部MCU读取
c语言·人工智能·单片机·嵌入式硬件·芯片·电子元器件
福楠8 小时前
从C到C++ | 内存管理
c语言·c++
集芯微电科技有限公司8 小时前
DC-DC|40V/10A大电流高效率升压恒压控制器
c语言·数据结构·单片机·嵌入式硬件·fpga开发
小麦嵌入式9 小时前
Linux驱动开发实战(十三):RGB LED驱动并发控制——自旋锁与信号量对比详解
linux·c语言·驱动开发·stm32·单片机·嵌入式硬件·物联网
fufu03119 小时前
Linux环境下的C语言编程(四十九)
linux·c语言·算法
范纹杉想快点毕业9 小时前
C语言设计模式:从基础架构到高级并发系统(完整实现版)
c语言·开发语言·设计模式