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

详解字符串函数<string.h>(上)

1. strlen函数的使用和模拟实现

size_t strlen(const char* str);

1.1 函数功能以及用法

字符串长度

strlen函数的功能是计算字符串的长度。在使用时,要求用户传入需要计算长度的字符串的起始位置,并返回字符串的长度。

#include <stdio.h>
#include <string.h>int main()
{char arr[] = "abcdef";int len = strlen(arr);printf("%d\n", len);return 0;
}

1.2 函数的原理

该函数在得到字符串的起始位置之后,会从该起始位置开始依次向后检索并计数,直到遇到'\0'为止。

1.3 注意事项

1. 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数(不包 含 '\0' )。

2. 参数指向的字符串必须要以 '\0' 结束。

3. 注意函数的返回值为size_t,是无符号的( 易错 )

针对第三点,我们给出以下示例

#include <stdio.h>
#include <string.h>
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if(strlen(str2)-strlen(str1)>0)//出错{printf("str2>str1\n");} else{printf("srt1>str2\n");}return 0;
}

由于strlen函数返回值的类型为“size_t”(unsigned int),所以两个strlen函数返回值相减,得到的结果的类型也是“size_t”,而该类型的数据一定会是大于等于零的,这与我们的代码所表达的意思不一致。

1.4 模拟实现

strlen的实现较为简单,所以这里给出三种实现方式:

1.4.1 计数器

在函数内部创建一个计数器,用以记录字符的个数

size_t my_strlen1(const char* str)
{assert(str);size_t count = 0;//计数器while(*str != '\0'){count++;str++;}return count;
}

1.4.2  指针-指针

size_t my_strlen2(const char* str)
{assert(str);const char* strx = str;while(*strx != '\0'){strx++;}return strx - str;//指针-指针
}

1.4.3 递归

size_t my_strlen3(const char* str)
{assert(str);if(*str == '\0')return 0;elsereturn 1 + my_strlen3(str+1);
}

2. strcpy函数的使用和模拟实现

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

2.1 函数功能以及用法

字符串拷贝

该函数会把“source”指向的字符串拷贝到“destination”指向的字符数组数组中,包括'\0'。在使用时,要求用户分别传入目标数组的起始地址和源字符串的起始地址,并返回目标数组的起始地址

#include <stdio.h>
#include <string.h>int main()
{char name[20] = {0};strcpy(name, "zhangsan");printf("%s\n", name);return 0;
}

2.2 函数的原理

“destination”和“source”依次逐字节移动,每次移动前将“source”指向的字符拷贝到“destination”指向的空间,直到将'\0'拷贝到目标数组中为止。

2.3 注意事项

1. 源字符串必须以 '\0' 结束。

2. 会将源字符串中的 '\0' 拷⻉到⽬标空间。

3. ⽬标空间必须⾜够⼤,以确保能存放源字符串。

4. ⽬标空间必须可修改。比如目标空间是处存放的是一个常字符串或者被const修饰的字符数组。

#include <stdio.h>
#include <string.h>int main()
{const char* p = "abcdef";char arr[] = "bit";strcpy(p, arr);return 0;
}

2.4 模拟实现

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

3. strcat函数的使用和模拟实现

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

3.1 函数功能以及用法

字符串追加

该函数会将“source”指向的字符串追加到“destination”指向的字符数组的后面,原本的'\0'会被覆盖,源字符串的'\0'会被一起追加到字符数组之后(某些实现中可能是额外添加的'\0')。在使用时,要求用户分别传入目标数组的起始地址和源字符串的起始地址,并返回目标数组的起始地址。

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "hello ";strcat(arr1, "world!");printf("%s\n", arr1);return 0;
}

3.2 函数的原理

首先找到目标数组结尾处的'\0',将其当作目标空间的起始地址的话,接下来的步骤就与strcpy相同了。

3.3 注意事项

1. 源字符串必须以 '\0' 结束。

2. ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。

3. ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。

4. ⽬标空间必须可修改。

5. 字符串自己给自己追加可能会出错。

#include <stdio.h>
#include <string.h>int main()
{char arr[20] = "hello";strcat(arr, arr);printf("%s\n", arr);return 0;
}

在第一个字符拷贝结束时,arr结尾的'\0'就被覆盖了,这时,strcat函数就不知道追加应该何时停止。 

3.4 模拟实现

char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* ret = dest;while(*dest){dest++;}while(*dest++ = *src++);return ret;
}

4. strcmp函数的使用和模拟实现

int strcmp(const char* str1, const char* str2);

4.1 函数功能以及用法

字符串比较

C语言标准规定:

第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 。

第⼀个字符串等于第⼆个字符串,则返回0 。

第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字。

#include <stdio.h>
#include <string.h>int main()
{char arr1[20] = "zhangsan";char arr2[] = "zhangsanfeng";int ret = my_strcmp(arr1, arr2);if(ret < 0)printf("<\n");else if(ret == 0)printf("=\n");elseprintf(">\n");return 0;
}

4.2 函数的原理

按下标依次比较两个字符串元素的ascll码值。

4.3 注意事项

好像没什么好注意的。

4.4 模拟实现

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

相关文章:

详解字符串函数<string.h>(上)

1. strlen函数的使用和模拟实现 size_t strlen(const char* str); 1.1 函数功能以及用法 字符串长度 strlen函数的功能是计算字符串的长度。在使用时&#xff0c;要求用户传入需要计算长度的字符串的起始位置&#xff0c;并返回字符串的长度。 #include <stdio.h> #…...

1、docker入门

文章目录 1、tocker简介2、tocker的安装&环境配置2、配置阿里云镜像3、基本命令1、镜像命令2、docker基本命令3、镜像基本命令4、Docker 容器常用命令 1、tocker简介 新一代的虚拟化技术 2、tocker的安装&环境配置 uname -r1、首先查看liunx的内核 yum update -y2、更…...

Qt应用软件【测试篇】cppchecker静态代码检查

文章目录 cppcheker简介下载地址与安装检查项目QT Creator使用CPP Cheker开启检查常见错误总结错误信息说明cppcheker简介 Cppcheck 是一个用于 C/C++ 代码的分析工具。它提供独特的代码分析以检测错误,并专注于检测未定义的行为和危险的编码结构。其目标是仅检测代码中的真实…...

[递推与递归]数的计算

题目描述 给出正整数 n&#xff0c;要求按如下方式构造数列&#xff1a; 只有一个数字 n 的数列是一个合法的数列。在一个合法的数列的末尾加入一个正整数&#xff0c;但是这个正整数不能超过该数列最后一项的一半&#xff0c;可以得到一个新的合法数列。 请你求出&#xff…...

Cocos Creator 3.8.x 后效处理(前向渲染)

关于怎么开启后效效果我这里不再赘述&#xff0c;可以前往Cocos官方文档查看具体细节&#xff1a;后效处理官网 下面讲一下怎么自己定义一个后处理效果&#xff0c;想添加自己的后效处理的话只需要在postProcess节点下添加一个BlitScreen 组件即可&#xff0c;然后自己去添加自…...

【前端素材】推荐优质后台管理系统 Adminity平台模板(附源码)

一、需求分析 1、系统定义 后台管理系统是一种用于管理网站、应用程序或系统的管理界面&#xff0c;通常由管理员和工作人员使用。它提供了访问和控制网站或应用程序后台功能的工具和界面&#xff0c;使其能够管理用户、内容、数据和其他各种功能。 2、功能需求 后台管理系…...

身份证号与姓名实名认证接口-二要素实名认证-C++接口代码

翔云&#xff08;https://www.netocr.com/idenNoOrd.html&#xff09;身份证二要素实名认证接口在当今的数字化社会中扮演着至关重要的角色&#xff0c;它不仅守护着网络世界的秩序&#xff0c;也悄然影响着现实生活的点滴。看似普通的身份证号实名认证接口也在悄然守护着人们的…...

笑营宝高校选修课报名考勤系统源码开发方案

一、项目背景与目标 &#xff08;一&#xff09;项目背景 随着高等教育的普及和教学模式的不断创新&#xff0c;高校选修课程体系日趋复杂多变。学生对课程选择的自由度提高&#xff0c;使得传统的选课和考勤管理方式变得繁琐且效率低下。目前&#xff0c;许多高校仍然采用纸…...

类型字段定义影响WebApi传值及SqlSugar调用Select创建新对象

ASP.NET Core编写的WebApi&#xff0c;由于输入参数较多&#xff0c;专门定义了输入参数类并设置[FromBody]方式传值&#xff0c;但测试时始终无法通过postman将输入参数值传递给WebApi&#xff0c;condition对象的所有属性值一直都为空。同时在WebApi内部调用SqlSugar查询数据…...

golang 函数式编程库samber/mo使用: IO

golang 函数式编程库samber/mo使用&#xff1a; IO 如果您不了解samber/mo库&#xff0c; 请先阅读第一篇 Option 在函数式编程中&#xff0c;副作用和纯函数是最常见的概念。 IO用来封装IO这类副作用。 什么是副作用 副作用是在计算结果的过程中&#xff0c;改变了系统状态…...

在OceanBase使用中,如何优化因Join估算不准导致执行计划选错的问题

作者&#xff1a;胡呈清&#xff0c;爱可生公司旗下的DBA团队成员&#xff0c;擅长故障分析和性能优化。爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。本文约 1600 字&#xff0c;预计阅读需要 15 分钟。 数据库版本&…...

potplayer安装

官网 解压运行即可...

PostgreSQL 与MySQL 对比使用

一、前言 博主的系统既有 用到MySQL 也有用到PostgreSQL &#xff0c;之所以用到这两种数据库&#xff0c;主要是现在都是国产替代&#xff0c;虽然说这两款数据库也不是国产的&#xff0c;但是相对开源&#xff0c;oracle是不让用了。所以现在使用比较多的就是这两个关系型数据…...

配置nginx代理访问openai接口

环境&#xff1a; 阿里云硅谷地区服务器&#xff0c;ubuntu22 操作步骤 1.安装nginx apt install nginx2.编辑文件/etc/nginx/sites-enabled/default&#xff0c;内容替换如下 server {listen 80;location / {proxy_pass https://api.openai.com;proxy_set_header Host api.…...

使用Python语言实现一个基于动态数组的序列队列

一、动态数组的实现 首先&#xff0c;我们需要创建一个DynamicArray类&#xff0c;该类将管理我们的动态数组。 动态数组能够动态地调整其大小&#xff0c;以容纳更多的元素。 目录 一、动态数组的实现 代码示例&#xff1a; 二、序列队列的实现 接下来&#xff0c;我…...

面试数据库篇(mysql)- 07索引创建原则与失效及优化

索引创建原则 1). 针对于数据量较大,且查询比较频繁的表建立索引。 2). 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。 3). 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。 4). 如果是字符…...

《互联网的世界》第三讲-tcp

dns 找到了地址&#xff0c;spf 确定了路径&#xff0c;如何运输数据呢&#xff1f;今天讲 tcp。 计算机网络领域的特定技术是最后当你干这个事时才要用的&#xff0c;我对孩子们这样说&#xff0c;实际上你可以随便看一个快递单子来理解端到端传输协议。 源地址&#xff0c…...

JOSEF约瑟 JZS-7G-42 AC220V静态可调延时中间继电器 端子式导轨安装15ms-10s

系列型号&#xff1a;JZS-7G-57端子排延时中间继电器&#xff1b;JZS-7G-42X端子排延时中间继电器&#xff1b;JZS-7G-22X端子排延时中间继电器&#xff1b;JZS-7G-21端子排延时中间继电器&#xff1b;JZS-7G-41端子排延时中间继电器&#xff1b;JZS-7G-51端子排延时中间继电器…...

Hudi配置参数优化

1&#xff09;Commits&#xff1a;表示一批记录原子性的写入到一张表中。 2&#xff09;Cleans:清除表中不再需要的旧版本文件。 3&#xff09;Delta_commit:增量提交指的是将一批记录原子地写入MergeOnRead类型表&#xff0c;其中一些/所有数据都可以写入增量日志。 4&…...

适用Java SpringBoot项目的分布式锁

在分布式系统中&#xff0c;常用到分布式锁&#xff0c;它有多中实现方式&#xff0c;如&#xff1a;基于redis&#xff0c;database&#xff0c;zookeeper等。Spring integration组件有这三种服务的分布式锁实现&#xff0c;今天来看看用的比较多的redis和database实现方式。 …...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14

什么是 Pattern Matching&#xff08;模式匹配&#xff09; ❝ 模式匹配就是一种“描述式”的写法&#xff0c;不需要你手动判断、提取数据&#xff0c;而是直接描述你希望的数据结构是什么样子&#xff0c;系统自动判断并提取。❞ 你给的定义拆解&#xff1a; ✴ Instead of …...

ffmpeg(三):处理原始数据命令

FFmpeg 可以直接处理原始音频和视频数据&#xff08;Raw PCM、YUV 等&#xff09;&#xff0c;常见场景包括&#xff1a; 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装&#xff08;如封装为 MP4、TS&#xff09; 处理原始 YUV 视频…...

华为云Flexus+DeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手

华为云FlexusDeepSeek征文 | 基于Dify构建具备联网搜索能力的知识库问答助手 一、构建知识库问答助手引言二、构建知识库问答助手环境2.1 基于FlexusX实例的Dify平台2.2 基于MaaS的模型API商用服务 三、构建知识库问答助手实战3.1 配置Dify环境3.2 创建知识库问答助手3.3 使用知…...