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

【C语言】常见字符串函数的功能与模拟实现

目录

1.strlen()

模拟实现strlen()

2.strcpy()

模拟实现strcpy()

3.strcat()

模拟实现strcat()

4.strcmp()

模拟实现strcmp()

5.strncpy()

模拟实现strncpy()

6.strncat()

模拟实现strncat()

7.strncmp()

模拟实现strncmp()

8.strstr()

模拟实现strstr()

9.strtok()

strtok的功能及注意事项

10.strerror()


1.strlen()

功能:用于计算字符串长度的函数,需要的参数是一个地址,得到地址之后会从这个地址开始往后找直到碰见\0,返回的是碰见\0之前统计的字符个数

strlen值得注意的点就是他的返回值是一个无符号数,可以通过这样一个代码来验证

按道理来说后面的比前面的字符串长,返回值不应该小于零吗,那应该打印小于等于吧,但是当我们运行之后发现运行结果居然是大于,这是因为strlen的返回值是一个无符号数,两个无符号数相减当然还是无符号数,因此打印结果是大于。如果想要判断哪个字符串长,直接这样写就行

如果就是要作差,把他们的返回值都强制类型转换成int类型即可

模拟实现strlen()

2.strcpy()

功能:把source指向的地址开始的字符串(包括\0)拷贝到destination指向的字符串去。

功能如图所示

注:1.strcpy的源串必须以\0结束

2.会把源串的\0拷贝到目标空间,并不是替换掉几个字符。

3.目标空间必须足够大,确保能够放得开拷贝的字符串

4.目标空间必须可变 比如char* p="abc",这里的abc就是一个常量字符串,是不可变的。

模拟实现strcpy()

实际上这个代码可以简化

后置++,先使用,再++,直到把\0赋给*des,这时候不满足while循环的条件,因此跳出循环。

3.strcat()

功能:把源头的字符串追加到目的串末尾。

模拟实现strcat()

注:strcat函数不能给自己追加,从模拟实现的原理就能看出来,当我们找到des的\0时,会用*src覆盖掉\0,比如我们要在hello后面追加一个hello,des指向\0的时候src指向了h,并用w把\0覆盖掉,然后des和src都往后走一步,直到源串追加到o的时候,再往后追加没有\0了,就又追加h了,导致死循环。

4.strcmp()

功能:比较两个字符串的大小,如果前者比后者大,返回一个大于零的值,反之返回一个小于零的值,如果二者相等就返回0。

模拟实现strcmp()

还可以简洁一点

5.strncpy()

功能:从source拷贝num个字符到destination去,如果source指向的字符串不够num个,多出来的个数均用\0代替

模拟实现strncpy()

6.strncat()

功能:在destination字符串第一个\0处追加num个source开头的字符。

注:1.只会追加num个,一旦追加完num个,就会自动补一个\0

2.如果source指向的字符串不足num个,在追加完source执行的字符串之后便会自动补一个\0,且只补一个。

模拟实现strncat()

7.strncmp()

功能:比较前num个字符的大小,如果前者大就返回一个大于零的值,后者大返回一个小于0的值,相等返回0。

注:只要前num个字符相等,不管后面是什么,都会返回0

模拟实现strncmp()

8.strstr()

功能:在字符串str1中找字符串str2第一次出现的位置,找到了就返回这个位置,找不到返回一个NULL

模拟实现strstr()

思路

各变量的作用:就是先要从第一个字符开始比较,如果第一个字符相同,再比较第二个,直到找到str2。如果我们直接操作str1和str2,就会导致这两个指针指向的位置被改变,那我们在比较完一个字符发现不行,想要从下一个字符开始找的时候,就不直到从哪开始了,因为此时str1已经不知道走到哪去了。因此我们需要一个cp指针来记录这个 如果从当前位置开始无法找到str2,下一个尝试寻找的位置。并且需要一个能让我们直接操作的指针s1。(因为cp既然是记录位置的,我们就不能在比较的过程中随意操作他)又因为每次重新开始寻找str2都要让srt2从头开始,因此我们也不能直接操作str2,因此我们又创建了一个s2指针用来在比较的时候操作。

找的过程显然是一个循环,只要cp没有指向\0我们就让他继续找,找的过程中是*s1与*s2比较,如果二者相等就一直比较,直到一方出现了\0,如果*s1已经是\0但是*s2不是\0,说明str1中已经不可能找到str2,我们直接返回NULL,如果发现*s2是\0,那不管此时*s1是不是\0,都已经找到了str2,此时返回cp。如果cp都已经指向了\0,说明肯定找不到了,返回NULL(实际上只要cp指向的字符串比str2短就不可能找到了)

注:这种写法有点像暴力枚举法,效率还是比较低的。

再来介绍两个函数的功能,这两个函数相较于前面几个用的比较少,就不模拟实现了

9.strtok()

strtok的功能及注意事项

1.sep参数是个字符串,定义了用作分隔符的字符集合

2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。

3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。也就是说这个函数内部有记录功能。

5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

6.如果字符串中不存在更多的标记,则返回 NULL 指针

下面是一个使用场景

当然这种场景是因为我们知道了字符串是什么,有几个分割符。如果想要一般性的调用,可以这样写

10.strerror()

库函数执行发生错误的时候会把一个错误码放在errno这个变量中,errno是C语言提供的一个全局变量。

每个错误码都有其对应的信息。我们可以打印一下看看

strerror函数返回的是错误码所对应字符串的首字符地址。

相关文章:

【C语言】常见字符串函数的功能与模拟实现

目录 1.strlen() 模拟实现strlen() 2.strcpy() 模拟实现strcpy() 3.strcat() 模拟实现strcat() 4.strcmp() 模拟实现strcmp() 5.strncpy() 模拟实现strncpy() 6.strncat() 模拟实现strncat() 7.strncmp() 模拟实现strncmp() 8.strstr() 模拟实现strstr() 9.str…...

pyGMT初步使用

文章目录 安装显示地图保存地图 安装 GMT,即Generic Mapping Tools,通用制图工具,是GIS领域应用最广泛的制图软件之一,用于绘制地图、图形以及进行地球科学数据分析和可视化。而pyGMT即其为python提供的函数接口,故而…...

神经网络 | CNN 与 RNN——深度学习主力军

Hi,大家好,我是半亩花海。本文主要将卷积神经网络(CNN)和循环神经网络(RNN)这两个深度学习主力军进行对比。我们知道,从应用方面上来看,CNN 用于图像识别较多,而 RNN 用于…...

thinkphp6入门(20)-- 如何上传图片、文件

1. 配置文件 设置上传的路径 对应文件夹 2. 前端 <div class"card-body"><h1 class"card-title">用户头像</h1><img src"../../../uploads/{$user.avatar_photo_path}" alt"avatar" height"100"/&g…...

【Linux技术宝典】深入理解Linux基本指令:命令行新手指南

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅Linux技术宝典 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 一、Linux下基本指令1. ls 指令2. pwd指令3. clear指令4. cd指令什么是家目录&#xf…...

C++:Level1阶段测试

总结。 只要你看过我的文章&#xff0c;哪怕只是一半&#xff0c;一定能够过关&#xff01; 准备好开始测试氻吗&#xff1f; 选择题&#xff0c;每题4分&#xff0c;共40分 1、 DevC的项目创建按钮是_____ A、文件[F]” → “新建[N]” → “项目[P]... B、工具[T]” → …...

autojs自动化刷视频脚本

视频展示 视频 //悬浮窗 // var window floaty.rawWindow( // <frame gravity"center" bg"#ff00ff"> // <button id"action" w"300dp" h"300dp"> // 按钮 // </button> // </fram…...

鲁南制药“健康幸福中国年”主题航班,开启探寻健康与幸福的旅程

“小年&#xff0c;小年&#xff0c;过了今天就是年。”提到过年&#xff0c;北方人的“过年”是从腊月二十三的“小年”开始的&#xff0c;而南方地区是在明天。虽然时间不同&#xff0c;但是浓浓的年味是一样的&#xff0c;红彤彤是主色调&#xff0c;喜洋洋是主乐曲&#xf…...

CISA知识点

审计流程21%&#xff1b;运营和业务恢复23%&#xff1b;保护资产27%&#xff1b;IT治理17%&#xff1b;开发12%。 领域1-信息系统审计流程 规划-现场工作-报告 &#xff08;1&#xff09;审计规划 了解业务使命、目标、目的和流程 找到相关规定 实施风险分析&#xff08;…...

C语言求解猴子分桃子

问题&#xff1a;海滩上有一堆桃子&#xff0c;五只猴子来分。第一只猴子把这堆桃子平均分为五份&#xff0c;多了一个&#xff0c;这只 猴子把多的一个扔入海中&#xff0c;拿走了一份。第二只猴子把剩下的桃子又平均分成五份&#xff0c;又多了 一个&#xff0c;它同样把多的…...

本地部署 Stable Cascade

本地部署 Stable Cascade 0. 引言1. 事前准备2. 本地部署 Stable Cascade3. 使用 Stable Cascade 生成图片4. Stable Cascade Github 地址 0. 引言 Stable Cascade 模型建立在 Wrstchen 架构之上&#xff0c;它与 Stable Diffusion 等其他模型的主要区别在于它的工作潜在空间要…...

LeetCode 二叉树/n叉树的解题思路

二叉树 二叉树特点是每个节点最多只能有两棵子树&#xff0c;且有左右之分二叉树的数据结构如下&#xff1a; public class TreeNode {//节点的值int val;//左子树TreeNode left;//右子树TreeNode right;TreeNode(int x) { val x; } }树节点的初始化&#xff1a; int val1;T…...

opencv mat用法赋值克隆的操作和一些基本属性

//Mat基本结构 (头部 数据部分) //赋值的话 就是修改了指针位置 但还是指向了原来数据 并没创建数据 本质上并没有变 //只有克隆或者拷贝时 它才会真正复制一份数据 //代码实现 //创建方法 - 克隆 //Mat m1 src.clone(); //复制 //Mat m2; //src.copyTo(m2); //赋值法 …...

【使用IDEA总结】01——新增作者信息、方法参数返回值

[TOC](目录) 1.类新增作者信息 打开IDEA的Settings&#xff0c;Editor->Code Style->File and Code Templates->Includes->File Header&#xff0c;输入以下作者信息&#xff0c;作者名更换为自己的即可&#xff0c;操作如下图所示 /*** Author Linhaipeng* Date…...

ElasticSearch分词器和相关性详解

目录 ES分词器详解 基本概念 分词发生时期 分词器的组成 切词器&#xff1a;Tokenizer 词项过滤器&#xff1a;Token Filter 停用词 同义词 字符过滤器&#xff1a;Character Filter HTML 标签过滤器&#xff1a;HTML Strip Character Filter 字符映射过滤器&#x…...

DolphinScheduler安装与配置

DolphinScheduler概述 Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 DolphinScheduler的主要角色如下&#xff1a; MasterServer采用分布式无…...

Qt之条件变量QWaitCondition详解

QWaitCondition内部实现结构图&#xff1a; 相关系列文章 C之Pimpl惯用法 目录 1.简介 2.示例 2.1.全局配置 2.2.生产者Producer 2.3.消费者Consumer 2.4.测试例子 3.原理分析 3.1.辅助函数CreateEvent 3.2.辅助函数WaitForSingleObject 3.3.QWaitConditionEvent …...

作为国产大模型之光的智谱AI,究竟推出了多少模型?一篇文章带你详细了解!

虽然OpenAI发布了一系列基于GPT模型的产品&#xff0c;在不同领域取得了很高的成就。但是作为LLM领域绝对的领头羊&#xff0c;OpenAI没有按照其最初的Open初衷行事。无论是ChatGPT早期采用的GPT3&#xff0c;还是后来推出的GPT3.5和GPT4模型&#xff0c;OpenAI都因为担心被滥用…...

学习转置矩阵

转置矩阵 将矩阵的行列互换得到的新矩阵称为转置矩阵 输入描述&#xff1a; 第一行包含两个整数n和m&#xff0c;表示一个矩阵包含n行m列&#xff0c;用空格分隔。 (1≤n≤10,1≤m≤10) 从2到n1行&#xff0c;每行输入m个整数&#xff08;范围-231~231-1&#xff09;&#x…...

AJAX——常用请求方法

1 请求方法 请求方法&#xff1a;对服务器资源&#xff0c;要执行的操作 2 数据提交 场景&#xff1a;当数据需要在服务器上保存 3 axios请求配置 url&#xff1a;请求的URL网址 method&#xff1a;请求的方法&#xff0c;GET可以省略&#xff08;不区分大小写&#xff09; …...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...