C语言:字符串函数、内存函数剖析

字符串函数、内存函数剖析

  • 一、字符串函数
    • (一)求字符串长度
      • 1、strlen
        • (1)库函数实现
        • (2)自定义实现
    • (二)长度不受限制的字符串函数
      • 1、strcpy
        • (1)库函数实现
        • (2)自定义实现
      • 2、strcat
        • (1)库函数实现
        • (2)自定义实现
      • 3、strcmp
        • (1)库函数实现
        • (2)自定义实现
    • (三)长度受限制的字符串函数介绍
      • 1、strncpy
      • 2、strncat
      • 3、strncmp
    • (四)字符串查找
      • 1、strstr
      • 2、strtok
    • (五)错误信息报告
      • 1、strerror
        • 2、prerror
  • 二、内存操作函数
    • (一)内存拷贝
      • 1、memcpy
        • (1)库函数实现
        • (2)自定义实现
      • 2、memmove
        • (1)库函数实现
        • (2)自定义实现
    • (二)内存比较
      • 1、memcmp
    • (三)内存设置
      • 1、memset
        • (1)库函数实现
  • 三、结束语

一、字符串函数

(一)求字符串长度

1、strlen

(1)库函数实现

strlen用来计算字符串的长度,遇到’\0’读取结束,这里‘\0’不算作长度。

size_t strlen ( const char * str );    

在这里插入图片描述

(2)自定义实现

自定义实现我们采取三种方式

//计数器实现
size_t my_strlen1(const char* str) {assert(str);int i = 0, count = 0;while (str[i]) {count += 1;i += 1;}return count;
}//指针的实现
size_t my_strlen2(const char* str) {assert(str);const char* p = str;while (*p != '\0') p = p + 1;return p - str;
}//递归的实现
size_t my_strlen3(const char* str) {assert(str);if (*str == '\0') return 0;else return my_strlen3(str + 1) + 1;
}

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

1、strcpy

(1)库函数实现
char * strcpy ( char * destination, const char * source );

strcpy用来将一个字符串复制到另一个字符串里面,包含’\0’。
目的空间要足够复制,不然程序会崩溃。

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

在这里插入图片描述

(2)自定义实现

这里while循环十分巧妙,既把’\0’复制进入destination,又结束循环
目的空间要足够复制,不然程序会崩溃。

char* my_strcpy(char* destination, const char* source) {assert(destination && source);char* ret;ret = destination;while (*destination++ = *source++) {;}return ret;
}

2、strcat

在目标字符串后面继续追加字符串
目的空间要足够复制,不然程序会崩溃。

(1)库函数实现
char * strcat ( char * destination, const char * source );

在这里插入图片描述

(2)自定义实现

目的空间要足够复制,不然程序会崩溃。

char* my_strcat(char* destination, const char* source) {assert(destination && source);char* ret = destination;while (*destination != '\0') destination += 1;while (*destination++ = *source++);return ret;
}

3、strcmp

strcmp用来比较两个字符串大小,C语言规定小于返回负数,大于返回负数,相等返回0。

(1)库函数实现
int strcmp ( const char * str1, const char * str2 );

在这里插入图片描述

(2)自定义实现
int my_strcmp(const char* arr1, const char* arr2) {assert(arr1 && arr2);while (*arr1 == *arr2) {if (*arr1 == '\0') return 0;arr1++;arr2++;}if (*arr1 > *arr2) return 1;else return -1;
}

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

1、strncpy

相比于strcpy,添加了比较数量, 从souce复制几个到destination。

char * strncpy ( char * destination, const char * source, size_t num );

2、strncat

相比于strcat,添加了追加数量,从souce追加几个到destination。

char * strncat ( char * destination, const char * source, size_t num );

3、strncmp

相比于strcmp,添加了比较数量。

int strncmp ( const char * str1, const char * str2, size_t num );

(四)字符串查找

1、strstr

const char * strstr ( const char * str1, const char * str2 );

在这里插入图片描述
在这里插入图片描述

2、strtok

char * strtok ( char * str, const char * delimiters );

用来将一个字符串里面的信息分开。
第一个字符串不可以传const修饰的字符串常量
在这里插入图片描述

(五)错误信息报告

1、strerror

代码生产时会有一个全局变量errno(错误码)
strerror将错误码所对应的错误字符串的首字符返回。

char * strerror ( int errnum );

在这里插入图片描述
在这里插入图片描述

2、prerror

prerror函数是strerror的升级版,相当于printf + strerror

void perror ( const char * str );

在这里插入图片描述

二、内存操作函数

(一)内存拷贝

1、memcpy

void * memcpy ( void * destination, const void * source, size_t num );

按照字节拷贝

(1)库函数实现

在这里插入图片描述
在这里插入图片描述

(2)自定义实现
void* my_memcpy(void* dest, const void* src, size_t num) {void* ret = dest;assert(dest && src);while (num--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}

2、memmove

相比于memcpy,可以针对重复内存的拷贝
按照字节拷贝

void * memmove ( void * destination, const void * source, size_t num );
(1)库函数实现

和memcpy相似

(2)自定义实现
void* my_memmove(void* dest,const void* src, size_t num)
{void* ret = dest;assert(dest && src);if (dest < src)//前->后{while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else//后->前{while (num--){*((char*)dest + num) = *((char*)src + num);}}return ret;
}

(二)内存比较

1、memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num );

依次按字节来比较两个内存块大小

(三)内存设置

1、memset

void * memset ( void * ptr, int value, size_t num );
(1)库函数实现

在这里插入图片描述
切记不可用来初始化设置整形数组中元素。如下,处理4个字节,就是一个整形空间
在这里插入图片描述
在这里插入图片描述

三、结束语

相信通过这篇文章,小伙伴们对字符串函数和内存函数的理解更加深刻了吧,记得给小编一个小小的赞哦!
在这里插入图片描述

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

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

相关文章

从零开始编写一个Chrome插件:详细教程

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119@qq.com] 📱个人微信:15279484656 🌐个人导航网站:www.forff.top 💡座右铭:总有人要赢。为什么不能是我呢? 专栏导…

CMDB运维管理平台是什么?

CMDB运维管理平台&#xff08;Configuration Management Database&#xff09;是一种致力于帮助企业有效管理和维护IT基础设施信息的工具。 在当今数字化浪潮的推动下&#xff0c;企业对IT系统的需求不断增长&#xff0c;IT基础设施复杂多样&#xff0c;为了有效管理这些系统的…

面试官没想到一个ArrayList,我都能跟他扯半小时

点赞再看&#xff0c;Java进阶一大半 南哥在stackoverflow社区看到14年前的这么一个问题&#xff1a;Java 的 Vector.add() 和 Vector.addElement() 有什么区别&#xff0c;大家有答案吗&#xff1f; 它们实际上没有区别&#xff01;&#xff01;&#xff01;1996年的JDK 1.0版…

大模型微调框架swift简介

Tuners 参数高效调优 内存高效调优

FPGA开发——蜂鸣器的控制

一、概述 在项目开发的过程当中&#xff0c;我会通常会需要一个东西就行报警显示&#xff0c;有使用语音报警&#xff0c;信息报警等注入此类的方式&#xff0c;但最为简单使用的还是蜂鸣器的使用&#xff0c;蜂鸣器控制简单&#xff0c;成本低&#xff0c;是最为常用的模块之…

job任务不执行问题

今天早上有个同事在job服务新增了一个定时任务之后,发现其他所有job任务都停止了. 具体问题为:job任务默认是单线程的, 新增的那个任务为一分钟一次, 一分钟之内任务没有执行完毕, 其他任务为一个阻塞状态,导致服务停止.

【从0制作自己的ros导航小车:上位机篇】02、ros1多机通讯与坐标变换可视化

从0制作自己的ros导航小车 前言一、ros1多机通讯二、rviz可视化小车坐标系 前言 上节课完成了里程计数据与坐标变换发布&#xff0c;但是还没有测试&#xff0c;本节进行测试&#xff0c;测试之前需要知道一件事&#xff0c;上位机也就是开发板一般不做可视化用&#xff0c;因…

【JavaScript】详解JavaScript语法

文章目录 一、变量和数据类型二、运算符三、条件语句四、循环语句五、函数六、对象和数组七、ES6新特性八、实际应用案例 JavaScript是一门广泛应用于Web开发的编程语言。掌握JavaScript语法是成为前端开发者的第一步。本文将详细介绍JavaScript的基本语法&#xff0c;包括变量…

[ARC105E] Keep Graph Disconnected题解

题目 考虑加任意一条边时都会输的图的状态&#xff1a;图被分成两个强联通分量&#xff0c;每一个强联通分量都是一个完全图。 也就是说&#xff0c;假设一开始节点 1 1 1 和节点 n n n 不联通&#xff0c;那么还可以加 n ( n − 1 ) 2 − m − c n t 1 ( n − c n t 1 ) \…

Overlay网络

Overlay 介绍 Overlay网络是将已有的物理网络&#xff08;Underlay网络&#xff09;作为基础&#xff0c;在其上建立叠加的逻辑网络&#xff0c;实现网络资源的虚拟化。 传统网络带来了以下一些问题&#xff1a; ● 虚拟机规模受 网络规格限制在传统二层网络环境下&#xff0…

删除的视频怎样才能恢复?详尽指南

在日常生活中&#xff0c;我们有时会不小心删除一些重要的视频文件&#xff0c;或者在整理存储空间时不慎丢失了珍贵的记忆片段。这时候&#xff0c;我们可以通过一些数据恢复工具和技巧&#xff0c;找回这些被删除的视频。本文将详细介绍几种常见且有效的视频恢复方法&#xf…

如何用PostMan按照规律进行循环访问接口

①设置动态变量 步骤一: 设置环境变量 1. 创建环境变量集合 在 Postman 左上角选择 "环境"&#xff0c;然后点击 "添加" 来创建一个新的环境变量集合。给它起一个名称&#xff0c;比如 "uploadDemo". 2. 添加初始变量 在新创建的环境变量集…

C语言边界互通传送迷宫

目录 注意事项开头程序程序的流程图程序输入与输出的效果结尾 注意事项 程序里有关字符’\033’的输出都关于Sunshine-Linux的其中一篇博客——《printf函数高级用法设置打印字体颜色和背景色等》 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们来看一下我用C语…

微服务面试-分布式 注册中心 远程调用 保护

标红的原理还是不太熟悉 重新看 分布式事务 CAP理论 Consistency&#xff08;一致性&#xff09; Availability&#xff08;可用性&#xff09; Partition tolerance &#xff08;分区容错性&#xff09; BASE 理论 就是做取舍 cap三选二 AT模式脏写 TCC模式 注册中…

4nm点状激光模组的应用让未来科技走向潮流

在科技发展时代&#xff0c;激光技术以其高精度、高效率的特性&#xff0c;正逐步成为众多行业不可或缺的核心技术之一。其中&#xff0c;4nm点状激光模组作为激光技术领域的佼佼者&#xff0c;凭借其卓越的性能和广泛的应用前景&#xff0c;正引领着科技发展的新潮流。接下来我…

UnityShaderUI编辑器扩展

前言&#xff1a; 当我们在制作通用Shader的时候&#xff0c;避免不了许多参数混杂在一起&#xff0c;尽管在材质面板已经使用过Header标签来区分&#xff0c;但是较长的Shader参数就会导致冗余&#xff0c;功能块不够简约明了&#xff0c;如图&#xff1a; 对于Shader制作者来…

用spingboot+vue实现酒店管理系统的不同角色登录功能(附源码)

酒店管理系统 一、项目介绍 1、项目用到的技术栈 开发工具&#xff1a;idea 语言&#xff1a;java、js、htmlajax 数据库&#xff1a;MySQL 服务器&#xff1a;Tomcat 框架&#xff1a;mybatis、jQuery、springboot、vue 2、项目实现功能 管理员和用户登录和退出功能以及用…

WSL for Windows

1、安装 超详细Windows10/Windows11 子系统&#xff08;WSL2&#xff09;安装Ubuntu20.04&#xff08;带桌面环境&#xff09;_wsl安装ubuntu20.04-CSDN博客https://blog.csdn.net/weixin_44301630/article/details/122390018 注意&#xff0c;安装之后首次启动 Ubuntu 时&…

NC 删除有序链表中重复的元素-I

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 删除给出链表…

用依赖倒置和控制反转,突破Golang循环调用限制之后的思考

在软件开发中&#xff0c;随着项目规模的扩大和业务逻辑的复杂化&#xff0c;重构代码变得越来越重要。本文将介绍如何在既有代码基础上&#xff0c;通过依赖倒置&#xff08;DIP&#xff09;和控制反转&#xff08;IoC&#xff09;&#xff0c;实现新增加的代码可以循环引用到…