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

文章目录

  • 一、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,一经查实,立即删除!

相关文章

MySQL报错:You can‘t specify target table ‘user‘ for update in FROM clause

一、问题 执行delete语句时&#xff0c;报错“You can’t specify target table ‘user’ for update in FROM clause” 翻译为“不能先select出同一表中的某些值&#xff0c;再update这个表(在同一语句中)”&#xff0c;即delete的目标表不能在其直接子查询中存在&#xff0…

leetcode876-Middle of the Linked List

题目 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间结点&#xff0c;值为 …

QML进阶(十六) 元素的布局和定位

文章目录 定位器Row定位Column定位Grid定位Flow定位定位器嵌套布局管理器RowyLayoutColumnLayoutGridLayoutQML有三种布局定位的方式分别为定位器(Item Positioner)、布局管理器(Item Layout)、锚定位(anchor)。锚定位在之前的内容中已经介绍过了,主要用于元素之间相对位置的锚…

Electron Forge | 跨平台实战详解

简介 上篇 介绍了 Electron 和 Electron Builder 的基本用法&#xff0c;本篇将介绍更常用也更方便的打包工具&#xff0c;Electron Forge 。 Electron Forge 是一个为 Electron 应用的开发、打包和分发而设计的全功能工具集。它整合了多个底层 Electron 工具到一个统一的命令…

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; 首先分析一下批量插入的逻辑 …

React Router DOM BrowserRouter

是 React Router DOM 库中的一个核心组件&#xff0c;它用于在 React 应用程序中设置路由&#xff0c;并允许你使用 HTML5 的 history API 来管理 URL。BrowserRouter 使用浏览器提供的 history API 来跟踪和管理 URL 的变化&#xff0c;这使得你可以在不刷新整个页面的情况下改…

蓝桥杯-地宫取宝

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 梁的振型仿真 固有频率…

iOS 让APP支持横竖屏

代码示例 Appdelegate添加属性&#xff08;在Appdelegate.m中添加该属性&#xff09; /** 是否允许横屏属性*/ property (nonatomic,assign)BOOL isAllowRotation; 设置可以支持的方向&#xff08;在AppDelegate.m中添加&#xff09; - (UIInterfaceOrientationMask)appli…

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;覆盖…