字符串和内存函数(1)

strcat函数

如上图,strcat函数就是将一个字符串拼接在另一个字符串后面,第一个参数是目标字符串,第二个参数是源字符串,strcat的返回值是目标字符串的起始地址。

注意:1.目标空间必须足够大,还需要可以修改。

           2.目标空间必须得有\0(保证能找到目标空间的末尾)

           3.原字符串中也得有\0,在拷贝时将源字符串中的\0也拷贝过去。

如下图,准备拷贝时在目标字符串第一个\0的位置就开始拷贝。

下方代码是模拟实现strcat函数,请读者自行理解。

char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);//找到目标空间的末尾while (*dest != '\0')dest++;//数据追加while (*dest++ = *src++);return ret;
}

 strcmp函数

如上图,strcmp函数是用来比较两个字符串相对位置的字符的ASCII的大小的,如果相对位置的大小相同,就往后一位比较,直到有大小不同的字符就停止比较。

返回值如下:1.当参数1大于参数2,返回大于0的数。

                      2.当参数1等于参数2,返回0。

                      3.当参数1小于参数2,返回小于0的数。

下方是模拟strcmp函数的实现。

int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}if (*str1 > *str2)return 1;elsereturn -1;
}

strncpy函数

 如上图,strncpy函数比strcpy函数多了一个参数,参数3是指参数2字符串拷贝的字符个数,在拷贝时,不会将参数2字符串末尾的\0拷贝过去。如果参数3的个数超过参数2的字符个数会发生什么呢?

 如上图,超过的部分会自动补\0,所以最终只会打印abc。

strncat函数

如上图,strncat函数的参数3跟strncpy的参数3类似,都是指个数,不过在拷贝时,会自动拷贝一个\0在末尾。

 ctrncmp函数

如上图, strncmp的参数3也是指个数,指的是两个字符串前num个相对位置的字符的大小,因为前三个字符都一样,所以返回值是0。

当个数是4时,前3个字符的大小一样,比较的就是d和q,q比d大,就返回小于0的数。

 strstr函数

strstr会返回str1中str2第一次出现的位置,如果str1中没有str2,就返回NULL。strstr是一个在字符串中找字符串的函数。 

下方是strstr函数的模拟实现和运行结果。

const char* my_strstr(const char* str1,const char* str2)
{const char* cp;//记录开始匹配的位置const char* s1;//遍历str1指向的字符串const char* s2;//遍历str2指向的字符串assert(str1 && str2);if (*str2 == '\0')return str1;  cp = str1;while (*cp){s1 = cp;s2 = str2;while (*s1&&*s2&&*s1 == *s2){s1++;s2++; }if (*s2 == '\0')return cp;cp++;}return NULL;
}int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbc";const char* ret = my_strstr(arr1, arr2);if (ret == NULL)printf("找不到\n");elseprintf("%s\n", ret);return 0;
}

 

分析:为了不改变原始数据,我们创建了另外3个指针, cp指向str1的起始位置,s1用来遍历str1指向的字符串,每次循环结束(即查找失败)时,cp++使cp指向str1的下一位,再把cp赋给s1。s2用来遍历str2指向的字符串,每次循环结束,就要使s2回到str2的起始位置。内层while的条件中*s1&&*s2用来判断他们是否已经遇到\0,如果遇到则停止,*s1==*s2用来判断相对应的字符是否相同,相同则继续。当*s2==\0时表明s2已经到str2的末尾了,说明已经在str1中找到和str2一样的字符串了,这时就可以直接返回此时cp的位置。还有一种特殊的情况,等str2时空字符串时,即"",我们直接返回str1的起始地址,因为空集是任何一个集合的子集。

 

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

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

相关文章

【数据仓库-10】-- 数据仓库、数据湖和湖仓一体架构

目录 1 数据仓库与数据库的对比 2 数据湖与数据仓库的对比 3 数据仓库、数据湖和湖仓一体

模型训练 出现NaN的原因以及解决方法

目录 前言1. 原因2. 解决方式 前言 1. 原因 模型训练过程中,修改Loss导致最后的结果出现NaN,一般是因为数值不稳定导致,主要有几个原因,只需要一一排查即可: 学习率过高: 过大的学习率可能导致权重更新过…

QT QStringList类常见用法

0. 实例化方式 QStringList fonts { "Arial", "Helvetica", "Times" }; 1. 三种遍历方式 QStringList fonts { "Arial", "Helvetica", "Times" };// 类STL迭代器for(auto f: fonts){qDebug() << f;}// …

λ表达式、智能指针

lambda 表达式 1、C11标准支持&#xff0c;实现匿名函数的功能&#xff1b; 2、通常用于实现轻量级的函数 格式 mutable->返回值{函数体}; // 返回值即使是 void 也必须得写 [] 内&#xff0c;可以填外部数据&#xff1b; () 内&#xff0c;可以带有参数列表。 lambda 表达…

力扣(LeetCode)1038. 从二叉搜索树到更大和树(C++)

先序遍历 根据题意&#xff0c;给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。模拟二叉搜索树替换到更大和数的过程&#xff0c; 请了解性质&#xff1a;二叉搜索树的先序遍历&#xff0c;是一个正序数组 …

flutter学习-day3-dart基础

&#x1f4da; 目录 变量声明操作符数据类型控制流错误处理和捕获函数mixin异步 FutureStream 本文学习和引用自《Flutter实战第二版》&#xff1a;作者&#xff1a;杜文 1. 变量声明 var 类似于 JavaScript 中的var&#xff0c;它可以接收任何类型的变量&#xff0c;但最大…

机器学习实验二:决策树模型

系列文章目录 机器学习实验一&#xff1a;线性回归机器学习实验二&#xff1a;决策树模型机器学习实验三&#xff1a;支持向量机模型机器学习实验四&#xff1a;贝叶斯分类器机器学习实验五&#xff1a;集成学习机器学习实验六&#xff1a;聚类 文章目录 系列文章目录一、实验…

linux管道_tee_xargs

5.2 管道 管道命令可以将多条命令组合起来&#xff0c;一次性完成复杂的处理任务。 语法&#xff1a; command1 | command2 | command3...例&#xff1a; 查看passwd中最后3行内容。 cat /etc/passwd | tail -3 查看passwd中包含root所在行的第一条信息。 cat /etc/p…

FPGA串口接收解帧、并逐帧发送有效数据——1

FPGA串口接收解帧、并逐帧发送有效数据 工程实现的功能&#xff1a;FPGA串口接收到串口调试助手发来的数据&#xff0c;将其数据解帧。判断到正确的帧头和帧尾之后&#xff0c;将有效数据存入rx_data中&#xff1b;另一方面发送端将有效数据逐帧发送出去。 参考&#xff1a;正…

【用Python根据用户名和手机号码生成Hash值并创建.cs .h和xlsx文件】

用Python根据用户名和手机号码生成Hash值并创建C Sharp .cs、嵌入式.h和xlsx表格文件 用Python根据用户名和手机号码生成Hash值并创建C Sharp .cs、嵌入式.h和xlsx表格文件&#xff0c;主要是为每个用户创建一个pubkey&#xff0c;并输出C Sharp C#和嵌入式 Keil的工程文件 pub…

字符编码演变

1.基础知识   我们在计算机屏幕上看到的是实体化的字符&#xff0c;而计算机存储介质中存放的实际上是二进制的比特流。这两者之间有一个转换规则&#xff0c;类比密码学中的加密解密&#xff0c;从“字符”到“比特流”称之为“编码”&#xff0c;从“比特流”到“字符”则称…

RAG落地实践、AI游戏开发、上海·深圳·广州线下工坊启动!星河社区重磅周

飞桨星河社区在成立的5年以来&#xff0c;已汇集660万AI开发者&#xff0c;覆盖深度学习初学者、在职开发者、企业开发者、高校教师、创业者等&#xff0c;已成为AI领域最具影响力的社区之一&#xff0c;无论是AI爱好者还是AI开发者&#xff0c;都能在这里探索AI的无限可能。飞…

城市分站建站系统源码 全新版本SEO推广优化排名高 附带完整的搭建教程

在过去的几年中&#xff0c;许多企业在建立网站时面临一些共同的问题&#xff1a;缺乏技术支持、不懂SEO、预算有限等。这些问题导致他们的网站无法充分发挥作用&#xff0c;无法在搜索引擎中获得良好的排名&#xff0c;进而影响到企业的业务发展。小编来给大家分享一款城市分站…

编译原理词法分析:NFA转DFA(原理+完整代码+可视化实现)

NFA转换为DFA 【本文内容摘要】 什么是DFA通过子集构造法将NFA转换为DFA生成DFA的dot文件并且形成可视化。 如果本文对各位看官有用的话&#xff0c;请记得给一个免费的赞哦&#xff08;收藏也不错&#xff09;&#xff01; 文章目录 NFA转换为DFA一、什么是DFA二、NFA转换为…

k8s引用环境变量

一 定义环境变量 ① 如何在k8s中定义环境变量 env、configmap、secret补充&#xff1a; k8s 创建Service自带的环境变量 ② 从pod属性中获取 kubectl explain deploy.spec.template.spec.containers.env.valueFrom关注&#xff1a; configMapKeyRef、fieldRef 和 resour…

初探Maven

文章目录 一、Maven概述二、安装配置Maven&#xff08;一&#xff09;下载Maven&#xff08;二&#xff09;安装Maven&#xff08;三&#xff09;配置Maven 三、IDEA里配置Maven&#xff08;一&#xff09;版本情况说明&#xff08;二&#xff09;配置构建工具Maven 一、Maven概…

如何批量修改ppt中的字体?

ppt制作已经属于是复杂的操作了&#xff0c;当我们想要更换ppt中的字体&#xff0c;有没有什么快捷的方法呢&#xff1f;今天分享两个方法&#xff0c;一键修改ppt文件字体。 方法一&#xff1a; 找到功能栏中的编辑选项卡&#xff0c;点击替换 – 替换字体&#xff0c;在里面…

python加速方法:纯CPU多进程加速(joblib库)

我写C 代码喜欢用OpenMP进行加速&#xff0c;在不更改源代码情况下只做稍稍修改即可实现CPU利用率最大化&#xff0c;跨平台移植也没有问题。 python是个好东西&#xff0c;苦恼于密级计算的时候只能使用单核&#xff0c;使用多线程不奏效&#xff0c;因为毕竟它受限于语言本身…

Javascript_根据截止日期超时自动返回

例如定时交卷功能&#xff0c;隐藏一个input id"endTime"存放超时时间&#xff0c;例如2023-12-01 20:56:15&#xff0c;使用如下代码即可实现超时自动处理。 <script src"/jquery.min.js"></script><script type"text/javascript&qu…

【Go】Go语言基础内容

变量声明&#xff1a; 变量声明&#xff1a;在Go中&#xff0c;变量必须先声明然后再使用。声明变量使用 var 关键字&#xff0c;后面跟着变量名和类型&#xff0c;如下所示&#xff1a; var age int这行代码声明了一个名为 age 的整数变量。 变量初始化&#xff1a;您可以在声…