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了,所以会一直这样追加追加下去

感谢观看

相关推荐
学习噢学个屁19 分钟前
基于51单片机心率仪—体温心率血氧蓝牙
c语言·单片机·嵌入式硬件·51单片机
千谦阙听21 分钟前
数据结构最终章:万字详解排序算法!(内部排序)
c语言·数据结构·学习·算法·排序算法
念恒123061 小时前
Linux基础开发工具(Vim篇)
linux·c语言
念恒123061 小时前
Linux基础开发工具(yum篇)
linux·c语言
老花眼猫1 小时前
数学艺术图案画-曼陀罗(二)
c语言·经验分享·青少年编程·课程设计
网域小星球1 小时前
C 语言从 0 入门(十九)|共用体与枚举:自定义类型进阶
c语言·开发语言·算法·枚举·自定义类型·共用体
无敌昊哥战神1 小时前
【算法与数据结构】深入浅出回溯算法:理论基础与核心模板(C/C++与Python三语解析)
c语言·数据结构·c++·笔记·python·算法
zore_c1 小时前
【C++】基础语法(命名空间、引用、缺省以及输入输出)
c语言·开发语言·数据结构·c++·经验分享·笔记
akarinnnn2 小时前
【DAY16】字符函数和字符串函数
c语言·数据结构·算法
Tairitsu_H2 小时前
C语言:排序(二)
c语言·开发语言·算法