当前位置: 首页 > news >正文

C语言(字符和字符串函数)2

         Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,欢迎欢迎~~     

                                                💥个人主页:小羊在奋斗

                                                💥所属专栏:C语言   

        本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为一些学友们展示一下我的学习过程及理解。文笔、排版拙劣,望见谅。 

                                6、strcmp 的使用和模拟实现

                                7、strncpy、strncat 和 strncmp

                                8、strtok 的使用和模拟实现

                                9、strstr 的使用和模拟实现

                                10、strerror 函数的使用

6、strcmp 的使用和模拟实现

        6.1 strcmp 的用法

        其实对于 strcmp 函数我们并不陌生,在之前的学习中已经不止一次用到过。

        strcmp 函数的作用是比较两个字符串的大小,当结果是大于时返回一个正值,小于时返回一个负值,等于时返回0。所以 strcmp 函数的返回值是int类型,我们在使用字符串函数的时候一定要清楚每个函数的返回值是什么。

        要特别注意的是,strcmp 函数比较两个字符串比较的不是字符串的长度,而是对应位置字符的ASCII码值。 

      可以看到,当对应位置字符的ASCII码值前者大于后者时,strcmp 函数返回了1;当小于时,strcmp 函数返回了-1;当等于时,strcmp 函数返回了0。来看下面代码示例:

        这个代码有没有什么问题呢?其实,上面的代码在VS中是没有任何问题的,但是在其他编译器中可能就会发生错误。其中的原因在 strcmp 函数的返回值上,我们说当前面的字符串大于后面的字符串时返回一个正值,但这个正值可以是任意正值,而在VS上规定这个正值为1,但是在其他编译器上并不见得这个正值都为1。

        6.2 strcmp 的模拟实现

        有了前几个模拟实现字符串函数的经验,模拟 strcmp 函数难度也不是太大。 

#include <stdio.h>
#include <assert.h>int my_strcmp(const char* str1, const char* str2)
{assert(str1 != NULL);assert(str2 != NULL);while (*str1 == *str2){if (*str1 == '\0'){return 0;}str1++;str2++;}if (*str1 > *str2){return 1;}else{return -1;}
}int main()
{char str1[] = "abcdef";char str2[] = "abcijk";int ret = my_strcmp(str1, str2);printf("%d\n", ret);return 0;
}

        特别的,还可以简化成下面的形式。

7、strncpy、strncat 和 strncmp

        出了 strcpy、strcat 和 strcmp 外,C语言还提供了更加灵活的 strncpy、strncat 和 strncmp,它们算是前三者的升级版,使用起来更加灵活。以 strncpy 为例:

        可以看到 strncpy 相较于 strcpy 多了一个参数,用于指定拷贝多少个字符。另外两个也是类似。

        虽然它们的逻辑表面上看起来是一样的,但是 strcnpy 和 strncat 之间还是有一点差异的

 

 

        可以看到 strncpy 不会给目标字符串主动添加 ‘\0’,但 strncat 就会主动给目标字符串添加 ‘\0’,这是两个函数间的差异。 

        那既然有了 strncat 函数,我们就能弥补上一小节中未能实现字符串自己拼接到自己后面的遗憾了。

8、strtok 函数的使用      

        更多详细介绍请跳转阅读 —> strtok, strtok_s - cppreference.com   

         看了上面的介绍好像还是云里雾里的,我用通俗的话来解释一下。delim 指向一个字符串,定义了用作分隔符的字符集合;第一个参数指定一个字符串,它包含了0个或多个由delim字符串中的一个或多个分隔符分割的标记;strtok 函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针(strtok 函数会改变被操作的字符串,所以被 strtok 函数切分的字符串一般都是临时拷贝的内容并且可修改);strtok 函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok 函数将保存它在字符串中的位置;strtok 函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记;如果字符串中不存在更多标记,则返回NULL指针。也就是说,只需要传递一次指向字符串的非空指针,剩下的都传空指针。

        上面的描述其实说的是  strtok 函数是一个过滤指定字符,提取出你想要的部分的函数。比如,有一个邮箱地址 18655404590@163.com,我们想要剔除其中的特殊字符 ‘@’ 和 ‘.’ ,提取出18655404590、163和com,那我们就可以使用 strtok 函数来实现。其中字符指针str指向目标字符串“18655404590@163.com”,delim 指向指定的分隔符“@、.”。

        但是,上面是我们事先知道字符串中有两个分隔符,所以写了三个打印函数,那如果我们不知道一个字符串中有多少个分隔符呢?这里可以用for循环来解决,之前我们在介绍for循环的文章中说过这么一句话,for循环通常用来解决循环次数未知的情况。

 

 9、strstr 的使用和模拟实现

        9.1 strstr 的使用

        更多详细介绍请跳转阅读 —> strstr - cppreference.com                简单来说,strstr 函数的作用是在一个字符串中查找另一个字符串,找到了就返回这个字符串第一次出现的起始地址,没找到就返回一个空指针。来看示例:

        9.2 strstr 的模拟实现

        模拟实现 strstr 函数之前,我们需要想清楚怎么在一个字符串中找另一个字符串是否存在呢?容易想到的是两个字符串通过指针解引用来一个一个的比较来判断是否存在一个相同的字符串,大致思路如下:

        (1)逐个字符地访问被查找的字符串,当访问到与目标字符串首字符相同的字符时记住这个可能的地址,方便后面返回;

        (2)当两个字符串的字符两两比较一直到目标字符串访问到 ‘\0’ 时说明找到了,返回之前记住的地址;

        (3)当被查找的字符串访问到 ‘\0’ 时说明被查找的字符串不存在,返回一个空指针;

        (4)综上,需要创建三个指针,其中两个指向被查找字符串,一个用来逐个访问字符,一个用来记住可能的地址,第三个指针指向目标字符串并且在改变了指针的指向后重新让其指向目标字符串的首地址。

#include <stdio.h>
#include <assert.h>char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = NULL;const char* s2 = NULL;const char* cur = str1;//用于返回可能的地址if (*str2 == '0')//当目标字符串是空字符串时{return cur;}while (*cur != '\0'){   s1 = cur;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')//找到了目标字符串{return cur;}cur++;}return NULL;//没找到
}int main()
{char str1[] = "abcdddeab";char str2[] = "deab";char* ps = my_strstr(str1, str2);if (NULL == ps){printf("不存在\n");}else{printf("%s\n", ps);}return 0;
}

10、 strerror 函数的使用

        更多详细介绍请跳转阅读 —> strerror, strerror_s, strerrorlen_s - cppreference.com

 

         简单地说,strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

        在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量 errno 来记录程序当前的错误码,只不过程序启动的时候 errno 是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码存放在 errno 中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是有对应的错误信息的,strerror 函数就可以将错误对应的错误信息字符串的地址返回来。

         整数0~10对应的错误信息如下:

         再来举一个例子,其中涉及到一些我们之前还没学到的内容,请不要在意,主要是 strerror 函数的用法。

         C语言函数中还有一个函数和 strerror 函数的功能是相似的,它就是 perror 函数。来看一下它的介绍:

        它和 strerror 函数的区别在哪里呢?

        strerror 函数的功能是将错误码对应的错误信息的字符串的地址返回,而 perror 函数的功能是将 errno 中错误码对应的错误信息打印出来。那它是怎样打印的呢?perror 函数打印的规则是先打印字符指针s指向的字符串,再打印一个冒号和一个空格,然后打印错误码对应的错误信息。 

 

        可以看到上面 printf 函数和 perror 函数打印的内容是一样的。

        也就是说 perror == printf + strerror。我们可以根据自己的选择选用这两个函数。

        如果觉得我的文章还不错,请点赞、收藏 + 关注支持一下,我会持续更新更好的文章。  

相关文章:

C语言(字符和字符串函数)2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…...

【数据结构与算法 | 栈篇】力扣20,150

1. 力扣20 : 有效的符号 (1). 题 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个…...

node依赖安装的bug汇总

1.npm仓库 首先要获取npm仓库的地址&#xff1a; registryhttp://11.11.111.1:1111/abcdefg/adsfadsf 类似这种的地址 然后设置npm仓库&#xff1a; npm config set registryhttp://11.11.111.1:1111/abcdefg/adsfadsf (地址要带等号) 接着安装依赖&#xff1a; npm i…...

Python中的 Lambda 函数

大家好&#xff0c;在 Python 编程的世界里&#xff0c;有一种功能强大却不常被提及的工具&#xff0c;它就是 Lambda 函数。这种匿名函数在 Python 中拥有着令人惊叹的灵活性和简洁性&#xff0c;却常常被许多开发者忽视或者只是将其当作一种附加功能。Lambda 函数的引入&…...

服务器遭遇黑洞后如何快速恢复与防范

在互联网世界中&#xff0c;“黑洞"一词常用于描述一种网络安全措施&#xff0c;即当服务器遭遇大规模DDoS攻击&#xff0c;为了保护网络基础设施和其他用户免受影响&#xff0c;网络服务商会暂时将受到攻击的IP地址流量导向一个"空洞”&#xff0c;使其不再响应任何…...

GPT-4o有点坑

GPT-4o有点坑 0. 前言1. GPT-4o简介2. GPT-4o带来的好处2.1 可以上传图片和文件2.2 更丰富的功能以及插件 3. "坑"的地方3.1 使用时间短3.2 GPT-4o变懒了 4. 总结 0. 前言 原本不想对GPT-4o的内容来进行评论的&#xff0c;但是看了相关的评论一直在说&#xff1a;技…...

【机器学习】探索未来科技的前沿:人工智能、机器学习与大模型

文章目录 引言一、人工智能&#xff1a;从概念到现实1.1 人工智能的定义1.2 人工智能的发展历史1.3 人工智能的分类1.4 人工智能的应用 二、机器学习&#xff1a;人工智能的核心技术2.1 机器学习的定义2.2 机器学习的分类2.3 机器学习的实现原理2.4 机器学习的应用2.5 机器学习…...

OceanBase 4.3.0 列存引擎解读:OLAP场景的入门券

近期&#xff0c;OceanBase 发布了4.3.0版本&#xff0c;该版本成功实现了行存与列存存储的一体化&#xff0c;并同时推出了基于列存的全新向量化引擎和代价评估模型。通过强化这些能力&#xff0c;OceanBase V4.3.0 显著提高了处理宽表的效率&#xff0c;增强了在AP&#xff0…...

算法每日一题(python,2024.05.25) day.7

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 难点&#xff1a;加一时可能出现9使得位数进一&#xff0c;而当特殊情况&#xff0c;即全部为9时&#xff0c;数组所在长度会变长一。 从末尾开始判断&…...

【正在线上召开】2024机器智能与数字化应用国际会议(MIDA2024),免费参会

【ACM出版】2024机器智能与数字化应用国际会议&#xff08;MIDA2024&#xff09; 2024 International Conference on Machine Intelligence and Digital Applications 【支持单位】 宁波财经学院 法国上阿尔萨斯大学 【大会主席】 Ljiljana Trajkovic 加拿大西蒙菲莎大…...

景源畅信:抖音的爆款视频怎么选?

在短视频风起云涌的今天&#xff0c;抖音作为其中的佼佼者&#xff0c;每天都有无数视频在这里诞生。但如何在内容海洋中脱颖而出&#xff0c;成为人们茶余饭后谈论的焦点&#xff0c;是许多创作者和品牌思考的问题。选择爆款视频&#xff0c;不仅需要对平台规则有深刻理解&…...

开源大模型源代码

开源大模型的源代码可以在多个平台上找到&#xff0c;以下是一些知名的开源大模型及其源代码的获取方式&#xff1a; 1. **艾伦人工智能研究所的开放大语言模型&#xff08;Open Language Model&#xff0c;OLMo&#xff09;**&#xff1a; - 提供了完整的模型权重、训练代…...

算法思想总结:哈希表

一、哈希表剖析 1、哈希表底层&#xff1a;通过对C的学习&#xff0c;我们知道STL中哈希表底层是用的链地址法封装的开散列。 2、哈希表作用&#xff1a;存储数据的容器&#xff0c;插入、删除、搜索的时间复杂度都是O&#xff08;1&#xff09;&#xff0c;无序。 3、什么时…...

基于Docker搭建属于你的CC++集成编译环境

常常&#xff0c;我会幻想着拥有一个随时可以携带、随时可以使用的开发环境&#xff0c;那该是多么美好的事情。 在工作中&#xff0c;编译环境的复杂性常常让我头疼不已。稍有不慎&#xff0c;删除了一些关键文件&#xff0c;整个编译链就会瞬间崩溃。更糟糕的是&#xff0c;…...

如何限制上网行为?上网行为管控软件有什么功能?

上网行为的管理与限制对于保障企业安全、提高员工工作效率以及保护孩子健康成长都显得尤为重要。 上网行为管控软件作为一种专业的工具&#xff0c;在这方面发挥着不可替代的作用。 本文将探讨如何限制上网行为&#xff0c;并介绍上网行为管控软件的主要功能。 一、如何限制上…...

重庆耶非凡科技有限公司的选品师项目靠谱吗?

在跨境电商和零售市场日益繁荣的今天&#xff0c;选品师的角色愈发凸显出其重要性。重庆耶非凡科技有限公司作为一家致力于多元化服务的科技公司&#xff0c;其选品师项目备受关注。那么&#xff0c;重庆耶非凡科技有限公司的选品师项目靠谱吗?接下来&#xff0c;我们将从多个…...

基于Cloudflare/CloudDNS/GitHub使用免费域名部署NewBing的AI服务

部署前准备&#xff1a; Cloudflare 账号 https://dash.cloudflare.com/login CloudDNS 账号 https://www.cloudns.net/ GitHub 账号 https://github.com/Harry-zklcdc/go-proxy-bingai Cloudflare 部署 Worker CloudDNS 获取免费二级域名 GitHub New Bing Ai 项目 https://git…...

redux状态管理用法详解

在React中使用redux&#xff0c;官方要求安装俩个其他插件 - Redux Toolkit 和 react-redux 1.ReduxToolkit (RTK) 官方推荐编写 Redux 逻辑的方式&#xff0c;是一套工具的集合集&#xff0c;简化书写方式 简化 store 的配置方式&#xff1b; 内置 immer 支持…...

细说ARM MCU中的MX_GPIO_Init()函数的实现过程

目录 1、建立.ioc工程 2、 MX_GPIO_Init()函数 &#xff08;1&#xff09;MX_GPIO_Init()函数的类型 &#xff08;2&#xff09;MX_GPIO_Init()函数中用到的结构体变量 &#xff08;3&#xff09;MX_GPIO_Init()函数使能时钟 &#xff08;4&#xff09;MX_GPIO_Init()函数…...

【wordpress】网站提示Error establishing a database connection错误代码

Error establishing a database connection错误代码处理方法&#xff1a; 检查数据库连接情况检查数据库账号密码是否正确检查数据库是否开启 总之较大可能是数据库出现了问题...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...