字符函数和字符串函数(上)

简介: 字符函数和字符串函数(上)

前言


求字符串长度

strlen

长度不受限制的字符串函数

strcpy

strcat

strcmp

长度受限制的字符串函数介绍

strncpy

strncat

strncmp

字符串查找

strstr

strtok


一. strlen


1. ‘\0’


‘\0’是字符串结束的表示

而strlen是统计直到‘\0’位置 不包括‘\0’

a5781a5a675e402b91dd9ac50db5a183.png

例如这个上面这段代码 输出的就是5 (因为遇到\0截止了)


2. 返回值


strlen的返回值是一个无符号整数 所以它一定是正数

我们来看下面这段代码


int main()
{
  char* str1 = "abcdef";
  char* str2 = "bbb";
  if (strlen(str2)-strlen(str1)>0)
  {
    printf(">");
  }
  else
  {
    printf("<");
  }
  return 0;
}


猜猜看 上面这段代码打印出来的结果是什么呢?


正确答案是‘>’


因为strlen函数的返回值是一个无符号数 所以说得到的数一定是大于等于0的


642b0134ca4d4f51ae8b157b55f3174b.png


如果想要它打印出小于号我们只需要再c后面加上一个\0 这样他们相减等于0 就可以打印出一个小于号了


8405025bd1714dea99ce1c834b010499.png


3. strlen的模拟实现


我们首先来看cpp官网上对于strlen的解释


efb768dc72084577a08ff4ce7803cf80.png


我们可以发现


strlen函数的返回时是一个无符号数

strlen函数的参数是一个char类型的指针


那我们来尝试实现这个函数


首先来画个图 解释下实现的原理


0be05761d9bb47f8ae80f0d655ef64fb.png


我们设计一个指针p 指向字符串的起始地址 另外再设计一个临时变量count


进入循环当中 每次p++ count++


直到p指向\0的时候 我们返回count的数值


代码表示如下


size_t my_strlen(char * p)
{
  assert(*p);//断言下 确保p不是空指针
  unsigned count = 0;
  while (*p)//当p的指向的内容不为0时 执行下方操作
  {
    p++;
    count++;
  }
  return count;
}


实现效果图如下


095c4475470e430c9f466dfbef665d5f.png


可以完美运行


二. strcpy


我们先来看cpp中的strcpy函数


char * strcpy ( char * destination, const char * source );


我们可以发现 它的返回值是一个char类型的指针

它的参数有两个都是指针 一个指向目的地 一个指向源地址


1. 源字符串必须以’\0’结束


这个很好理解 如果源字符不是以’\0’结束的话 那么它要拷贝的长度是未知的

我们不能很好的控制这个函数


2. 会将源字符中的’\0’拷贝到目标空间中


代码如下


int main()
{
  char arr1[20] = { 1 };
  char arr2[] = "hello world";
  strcpy(arr1, arr2)
  return 0;
}

我们可以发现 arr1中的代码变成了hello world 而不是hello world 11111… 这样就可以证明 它会将’\0’拷贝到目的地中


1c0538c3581340daa9632ed4632b1139.png


3. 目标空间要足够大 能够存放需要拷贝的数据


这个是常识了 如果目标空间不够大会报错


如下图所示


ceaad758ef7d433b9f9792869b01f90d.png


4. 模拟实现


我们画图来表示下


90ea38b240674be697fd27768c6578df.png

其实这个函数我们再前面以及模拟实现过了


设计两个指针 一个指向目的地 一个指向源字符串


然后将源字符串的值赋值给目的地 并且接着下一个字符 直到达到源目的地的\0为止

代码如下


char* my_strcpy(char* des, char* str)
{
  assert(des && str); //断言 保证不是空指针
  char* ret = *des;
  while (*des++=*str++)
  {
    ;
  }
  return ret;
}


我们可以发现 代码是可以完美运行的


3e85f7dd019f4679a474ef8e975a4495.png

相关文章
|
存储 Kubernetes Linux
Kubernetes 的配置资源 ConfigMap(01部分)
Kubernetes 的配置资源 ConfigMap(01部分)
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
360 0
|
Java Maven
idea导入maven项目结构不全
idea导入maven项目结构不全
524 6
|
Java 数据安全/隐私保护 Apache
|
10月前
|
存储 算法 数据安全/隐私保护
基于方块编码的图像压缩matlab仿真,带GUI界面
本项目展示了基于方块编码的图像压缩算法,包括算法运行效果、软件环境(Matlab 2022a)、核心程序及理论概述。算法通过将图像划分为固定大小的方块并进行量化、编码,实现高效压缩,适用于存储和传输大体积图像数据。
点击全选,使所有复选框被选中
点击全选,使所有复选框被选中
119 0
|
存储 缓存 Java
Java 文件 & 文件操作
Java 文件 & 文件操作
|
Java API
uniapp跨域问题解决办法
uniapp跨域问题解决办法
681 0
|
C语言
C语言笔试训练【第五天】
C语言笔试训练【第五天】
C语言笔试训练【第五天】
|
SQL 负载均衡 安全
MySQL-中间件mycat(三)
MySQL-中间件mycat(三)
408 0