【字符函数与字符串函数】

文章目录

  • 一、strlen函数
      • 1.strlen函数的使用
      • 2.strlen函数的模拟实现
        • (1)计算器办法
        • (2)不创建临时变量计数器
        • (3)指针
  • 二、strcpy函数
      • 1、strcpy函数的使用
      • 2、strcpy函数的模拟实现
  • 三、strcat函数
      • 1、strcat函数的使用
      • 2、strcat模拟实现
      • 3、字符串自己给自己追加?
  • 四、strcmp函数
      • 1、strcmp函数的使用
      • 2、strcmp函数的模拟实现
  • 五、strncpy函数
      • 1、strcnpy函数的使用
      • 2、strncpy的模拟实现
  • 六、strncat函数
      • 1、strncat函数的使用
      • 2、strncat函数的模拟实现
  • 七、strncmp函数
      • 1、strncmp函数的使用
      • 2、strncmp函数的模拟实现

一、strlen函数

1.strlen函数的使用

  • 字符串是以'\0'为结束标志,strlen是统计的'\0'前面的字符个数,不包括'\0'
  • 函数的返回值是size_t,无符号的
  • 参数指向的字符串必须要包含'\0'
  • strlen需要包含头文件<string.h>
#include<stdio.h>
#include<string.h>
int main()
{char arr[100] = { "xiaowang,nihenhao" };size_t ret = strlen(arr);printf("%d ", ret);return 0;
}

2.strlen函数的模拟实现

(1)计算器办法
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)   //const——不改变我arr中的字符串内容
{size_t count = 0;assert(str);   //断言while (*str != '\0'){count++;str++;}return count;
}
int main()
{char arr[100] = "hello,nicwe";size_t ret = my_strlen(arr);printf("%d ", ret);return 0;
}
(2)不创建临时变量计数器
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{assert(str);if (*str == '\0')return 0;else{return 1 + my_strlen(str + 1);}
}
int main()
{char arr[100] = "hello,world!";size_t ret = my_strlen(arr);printf("%d ", ret);return 0;
}
(3)指针
#include<stdio.h>
#include<assert.h>
int my_strlen(const char* str)
{assert(str);char* p = str;while (*p != '\0'){p++;}return p - str;
}
int main()
{char arr[100] = "hello world!";size_t ret = my_strlen(arr);printf("%d ", ret);return 0;
}

二、strcpy函数

1、strcpy函数的使用

在这里插入图片描述

  • 源字符串中必须是'\0'结束
  • 将源字符串中的'\0'拷贝到目标空间
  • 目标空间要求足够大,可以容纳下源字符串
  • 目标空间要求是可以修改的
  • 需要包含头文件<string.h>
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "hello,";char str[20] = { 0 };strcpy(str,arr);printf("%s ", str);return 0;
}
     strcpy(str,arr);//str就是我们的目标空间,arr就是我们的源字符串//这里是指arr中的字符串拷贝到str中

2、strcpy函数的模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* p1, const char* p2)
{assert(p2,p1);char* str1 = p1;//拷贝的是'\0'之前的字符while (*p2 != '\0'){*p1++ = *p2++;}*p1 = '\0';//把'\0'拷贝到最后return str1;
}
int main()
{char arr[20] = "hello";char str[20] = { 0 };char* ret = my_strcpy(str, arr);printf("%s ", ret);return 0;

三、strcat函数

1、strcat函数的使用

在这里插入图片描述

  • 源字符串必须以'\0'结束
  • 目标字符串中需要用'\0',否则不知道源字符串追加到哪里
  • 目标字符串的空间需要足够的大,要能够容纳下源字符串
  • 目标空间必须修改
  • 需要头文件<string.h>
#include<stdio.h>
#include<string.h>
int main()
{char arr[20] = "hello,";char str[20] = "world";strcat(arr, str);printf("%s ", arr);return 0;
}

2、strcat模拟实现

#include<stdio.h>
#include<assert.h>
char* my_strcat(char* p1, const char* p2)
{assert(p1, p2);char* str1 = p1;while (*p1 != '\0'){p1++;}while (*p2 != '\0'){*p1++ = *p2++;}*p1 = '\0';return str1;
}
int main()
{char arr[20] = "hello,";char str[10] = "world";char* ret = my_strcat(arr, str);printf("%s ", ret);return 0;
}

3、字符串自己给自己追加?

首先我们可以直接使用一下strcat函数看看:

#include<stdio.h>
#include<string.h>
int main()
{char arr[200] = "hello,";strcat(arr, arr);printf("%s ", arr);return 0;
}

结果我们是可以得到hello,hello,的。

但是,当我们自己以上面的形式进行模拟实现时,我们可以发现,模拟实现的并没有成功,因为比标准库函数会进行错误处理,确保不会放生缓冲区溢出等问题,所以我们自己写的模拟实现仅仅只是一个参考,至于标准库函数是怎么实现的,我们也是不得而知的。

四、strcmp函数

1、strcmp函数的使用

在这里插入图片描述

  • 标准规定:

  • 当第一个字符串大于第二个字符串时,返回一个大于0的数字

  • 当第一个字符串小于第二个字符串时,返回一个小于0的数字

  • 当第一个字符串与第二个字符串相等时,返回0

在这里插入图片描述

  • 判断两个字符串的本质:
    就是比较两个字符串的ASCII码值的大小
#include<stdio.h>
#include<string.h>
int main()
{char arr[20] = "adcgft";char str[20] = "gdhuo";int ret=strcmp(arr, str);if (ret > 0){printf("大的是%s ", arr);}else if (ret < 0){printf("大的是%s ", str);}elseprintf("一样大小\n");return 0;
}

输出的是gdhuo,因为g的ASCII码值大于a,所以字符串str大于arr。

2、strcmp函数的模拟实现

int my_strcmp(const char* p1, const char* p2)
{assert(p1, p2);while (*p1 ==*p2){if (*p1 == '\0')return 0;p1++;p2++;}return *p1 - *p2;
}
int main()
{char arr[29] = "asdftgh";char str[20] = "asdft";int ret = my_strcmp(arr, str);printf("%d \n", ret);if (ret > 0){printf("大的是%s \n", arr);}else if (ret < 0){printf("大的是%s \n", str);}elseprintf("一样大小\n");return 0;
}

我们这里的ret等于103就可以知道,两个字符串比较大小,使用strcmp函数返回的是ASCII码值的差值。

五、strncpy函数

在这里插入图片描述

相比较于strcpy,两个字母相差与一个字母n,两者的作用本质上是一样的。

1、strcnpy函数的使用

在这里插入图片描述

  • 拷贝从源字符串中的num个字符到目标空间中
  • 如果源字符串没有num个字符,则在后面追加0,直到凑为num个数
#include<stdio.h>
#include<string.h>
int main()
{char arr[20] = "hello,world";char str[30] = { 0 };strncpy(str, arr, 19);printf("%s \n", str);return 0;
}

2、strncpy的模拟实现


#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* p1, const char* p2,size_t n)
{assert(p1, p2);char* dest = p1;while (n&&*p1=='\0'){*p1 = *p2;p1++;p2++;n--;}if (n > 0){*p1 = '\0';}return dest;
}
int main()
{char arr[] = "helllow";char str[20] = { 0 };char* ret = my_strncpy(str, arr, 5);printf("%s \n", ret);return 0;
}

六、strncat函数

1、strncat函数的使用

在这里插入图片描述

  • 相差与strcat函数的功能只多了个size_t num——是指source中的字符追加num个到destination中,最后还会再追加个'\0'
  • 同时也需要包含头文件<string.h>
    在这里插入图片描述
#include<stdio.h>
#include<string.h>
int main()
{char arr[30] = "hello,";char str[10] = "world,li";strncat(arr, str, 5);printf("%s ", arr);return 0;
}

在这里插入图片描述

2、strncat函数的模拟实现

在这里插入图片描述
返回的是目标数组的地址

#include<stdio.h>
#include<assert.h>
char* my_strncat(char* p1, char* p2, size_t m)
{assert(p1, p2);//断言——看传递是否是野指针int* ret = p1;while (*p1 != '\0'){p1++;}while (*p2 != '\0' && m != 0){*p1 = *p2;p1++;p2++;m--;}if (m > 0){*p1 = '\0';}return ret;
}
int main()
{char arr[40] = "hello,";char str[20] = "world,liming";my_strncat(arr, str, 4);printf("%s ", arr);return 0;
}

其中结果是hello,worl

七、strncmp函数

1、strncmp函数的使用

  • strncmp函数和strcmp函数道理一样,都是比较字符串的大小,而strncmp函数是比较前num个字符的大小。(最多比较num个)
  • 如果提前发现不一样,就提前结束;如果num个字符的比较完了且相等,那么返回0.
    在这里插入图片描述
    在这里插入图片描述
#include<stdio.h>
int main()
{char arr[20] = "qieyouyou";char str[20] = "qiekenao";int ret=strncmp(arr, str, 5);printf("%d ", ret);return 0;
}

结果是返回大于1的数字,说明arr数组的前5个字符大于str数组的前5个字符

2、strncmp函数的模拟实现

#include<stdio.h>
#include<assert.h>
int my_strncmp(const char* p1, const char* p2, size_t n)
{assert(p1, p2);while (n != 0){while (*p1 != '\0' && *p2 != '\0' && n != 0){if (*p1 == *p2) {p1++;p2++;}n--;}return *p1 - *p2;}if (n == 0){return 0;}
}
int main()
{char arr[20] = "qieyouypou";char str[20] = "qieyoumij";int ret = my_strncmp(arr, str, 7);printf("%d ", ret);return 0;
}

好了,今天就到这里啦,后续我还会继续更新的,最近有一丢丢的忙,更新比较慢(望谅解!)

老规矩附上一张好看的图片(祝愿大家找到自己人生中想要的东西,加油哦!!!)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/10858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01-单片机商业项目编程,从零搭建低功耗系统设计

一、引言 这是关于《单片机商业编程之从零搭建低功耗系统》的第一篇章&#xff0c;个人善忘&#xff0c;平常项目设计当中的一些思路&#xff0c;以前年轻的时候习惯性的录制成视频&#xff0c;也算是当作是自己的笔记&#xff0c;无奈现在喉咙实在扛不住&#xff0c;因此先尝试…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第一周) - 自然语言处理介绍和线性分类

自然语言处理介绍和线性分类 1. 自然语言处理介绍2. 线性二分类3. 情感分析和基础特征提取 3.1. 情感分析3.2. 特征提取3.3. 文本预处理 4. 学习的基础-梯度下降算法5. 感知机6. 逻辑回归7. 情感分析8. 感知机和逻辑回归 1. 自然语言处理介绍 自然语言处理的目标是什么 能够解…

(2024,KAN,MLP,可训练激活函数,样条函数,分层函数)Kolmogorov–Arnold 网络

KAN: Kolmogorov–Arnold Networks 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. KAN 2.1 KA 表示定理 2.2 KAN 架构 2.3 KAN 的逼近能力和缩放定律 2.4 对于…

国产操作系统下使用dpkg命令管理软件包 _ 统信 _ 麒麟 _ 中科方德

往期好文&#xff1a;国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello&#xff0c;大家好啊&#xff01;在Linux系统中&#xff0c;dpkg是Debian包管理系统的基础命令工具&#xff0c;它允许用户安装、卸载、查询和管理软件包。在国产操作系统如统信UOS和麒麟KOS、中科方…

字节码基础

基本概念 java中的字节码&#xff0c;英文bytecode。是java代码编译后的中间代码格式。JVM需要读取并解析字节码才能执行相应的任务。java字节码是JVM的指令集。JVM加载字节码格式的class文件。校验之后通过JIT编译器转换成本机机器代码执行。 java字节码简介 1、java byteco…

阿里云部署ChatGLM-6B及ptuning微调教程

一、模型部署 1.进入阿里云人工智能平台PAI。 2.申请免费试用。 3.打开交互式建模 PAI-DSW。 4.新建实例。 5.填写配置。 6.实例准备完成后点击打开。 7.打开实例后点击Teminal。 8.在Teminal中依次输入以下命令并执行。 apt-get update apt-get install git-lfs git lfs ins…

SQLite利用事务实现批量插入(提升效率)

在尝试过SQLite批量插入一百万条记录&#xff0c;执行时长高达20多分钟后&#xff0c;就在想一个问题&#xff0c;这样的性能是不可能被广泛应用的&#xff0c;更不可能出现在真实的生产环境中&#xff0c;那么对此应该如何优化一下呢&#xff1f; 首先分析一下批量插入的逻辑 …

蓝桥杯-地宫取宝

X 国王有一个地宫宝库&#xff0c;是 nm 个格子的矩阵&#xff0c;每个格子放一件宝贝&#xff0c;每个宝贝贴着价值标签。 地宫的入口在左上角&#xff0c;出口在右下角。 小明被带到地宫的入口&#xff0c;国王要求他只能向右或向下行走。 走过某个格子时&#xff0c;如果那个…

网络工程师----第二十四天

计算机基础 第一章&#xff1a;概述 互联网的组成&#xff1a; &#xff08;1&#xff09;边缘部分&#xff1a;由所有连接在互联网上的主机组成。这部分是用户直接使用的&#xff0c;用来进行通信&#xff08;传送数据、音频或视频&#xff09;和资源共享。 &#xff08;2…

Python大数据分析——Logistic回归模型

Logistic回归模型 概念理论分析模型评估混淆矩阵ROC曲线KS曲线 函数示例 概念 之前的回归的变量是连续的数值变量&#xff1b;而Logistics回归是二元离散值&#xff0c;用来解决二分类问题。 理论分析 上式中的hβ(X)也被称为Loqistic回归模型&#xff0c;它是将线性回归模型…

2-1 EXTI外部中断(gd32)

中断的概念 中断硬件结构/软件结构 EXTI中断 EXTI硬件结构 注&#xff1a;EXTI线在同一时刻只能连接一个GPIO口&#xff0c;如果我们先连接了PA0,然后又连接了PB0那么此时PA0这个IO口就失去作用。 中断触发函数 中断优先级 中断优先级 数值越小优先级越高&#xff0c;抢占优先级…

247 基于matlab的梁的振型仿真

基于matlab的梁的振型仿真。利用有限元理论&#xff0c;求二维梁的固有频率和振型。短边固定&#xff0c;给定长度、横截面积&#xff0c;弹性模量及材料密度已知。并对比理论计算结果进行分析。各参数自己设定。程序已调通&#xff0c;可直接运行。 247 梁的振型仿真 固有频率…

Unity2D 模拟手柄实现玩家移动

1&#xff0c;创建控制器UI 2&#xff0c;挂载脚本 3&#xff0c;脚本编写 基本要素 [Tooltip("玩家游戏体")]public Rigidbody2D player;[Tooltip("玩家速度")]public float speed 1f;[Tooltip("玩家动画")]public Animator animator;public …

企业级复杂前中台项目响应式处理方案

目录 01: 前言 02: 响应式下navigtionBar实现方案分析 数据 视图 小结 03: 抽离公用逻辑&#xff0c;封装系列动作 04: PC端navigationBar私有逻辑处理 05: 分析 navigationBar 闪烁问题 06: 处理 navigationBar 闪烁问题 07: category数据缓存&#xff0c;覆盖…

Android 13 系统自定义安全水印

效果 源码实现 frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public final void showSafeModeOverlay() {View v LayoutInflater.from(mContext).inflate(com.android.internal.R.layout.safe_mode, null);WindowManager.Layout…

程序员工作中常见问题,你遇到过几个?

在赛博朋克2077玩后感中&#xff0c;我提到&#xff0c;即便是在严谨的机制下&#xff0c;依然可能出现让人匪夷所思或是贻笑大方的问题。 那么今天&#xff0c;就以后端程序员的视角&#xff0c;盘点下从设计开发到上线的常见问题&#xff0c;看看大家中过几个。 01 设计与开…

问题与解决:大华视频后台播放报错

大华播放器接到BI系统后&#xff0c;实时监控视频后台播放一段时间后&#xff0c;报错如下&#xff1a; The play() request was interrupted because video-only background media was paused to save power. 在谷歌浏览器下&#xff0c;直接用代码运行系统&#xff0c;视频在…

python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解

这篇文章主要介绍了python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 JDBC Request 这个 Sampler 可以向数据…

正点原子Linux学习笔记(九)在 LCD 上显示字符

在 LCD 上显示字符 23.1 原始方式&#xff1a;取模显示字符23.2 freetype 简介23.3 freetype 移植下载 FreeType 源码交叉编译 FreeType 源码安装目录下的文件移植到开发板 23.4 freetype 库的使用初始化 FreeType 库加载 face 对象设置字体大小加载字形图像 23.5 示例代码 前面…

FPGA第2篇,FPGA与CPU GPU APU DSP NPU TPU 之间的关系与区别

简介&#xff1a;首先&#xff0c;FPGA与CPU GPU APU NPU TPU DSP这些不同类型的处理器&#xff0c;可以被统称为"处理器"或者"加速器"。它们在计算机硬件系统中承担着核心的计算和处理任务&#xff0c;可以说是系统的"大脑"和"加速引擎&qu…