c进阶篇(三):字符串函数

1.strlen:

strlen - C++ Reference

strlen 函数是一个标准库函数,用于计算以 null 结尾的字符串的长度,也就是字符串中实际字符的数量,不包括最后的 null 终止符 \0。它定义在 <string.h> 头文件中。

函数原型:size_t strlen(const char *str);

参数:str:指向以 null 结尾的字符串的指针。

返回值:返回一个 size_t 类型的值,表示字符串 str 中的字符数,不包括结尾的 null 字符。

使用示例:

模拟其实现代码如下:

size_t my_strlen1(const char *str) {int count = 0;assert(str != NULL);while (*str++) {count++;}return count;
}
size_t my_strlen2(const char* str) {assert(str != NULL);if (*str != '\0') {return 1 + my_strlen2(str+1);}else {return 0;}
}
size_t my_strlen3(const char* str) {assert(str != NULL);char* start = str;while (*str) {str++;}return str - start;
}

2.strcpy

strcpy - C++ Reference

函数原型:char *strcpy(char *dest, const char *src);

参数:dest:目标字符串的指针,它是一个指向足够大的字符数组或者字符指针,用于存储复制后的字符串。src:源字符串的指针,是一个指向以 null 结尾的字符串的指针,将被复制到目标字符串中。

返回值:返回指向目标字符串 dest 的指针,即复制后的字符串的起始地址。

使用示例:

模拟其实现代码如下:

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

注意事项:

  1. 目标字符串必须足够大dest 指向的内存空间必须足够大,能够容纳 src 指向的字符串及其结尾的 null 字符。否则可能会导致缓冲区溢出,产生未定义的行为。

  2. null 结尾符strcpy 函数会复制 src 指向的字符串直到遇到 null 结尾符为止。因此,复制的结果将会包括 null 结尾符。

  3. 安全性:使用 strcpy 函数时,应确保 src 指向的字符串确实以 null 结尾,否则可能会导致未定义的行为。

3.strcat

strcat - C++ Reference

strcat 函数用于将一个字符串追加到另一个字符串的末尾。它同样定义在 <string.h> 头文件中。

函数原型:char *strcat(char *dest, const char *src);

参数dest:目标字符串的指针,是一个以 null 结尾的字符数组或者字符指针,将被用作目标。

src:源字符串的指针,是一个以 null 结尾的字符数组或者字符指针,将被追加到目标字符串的末尾。

返回值:返回指向目标字符串 dest 的指针,即追加后的字符串的起始地址。

使用示例:

模拟其实现代码如下:

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

注意事项

  1. 目标字符串必须足够大:与 strcpy 类似,dest 指向的内存空间必须足够大,能够容纳 src 指向的字符串及其结尾的 null 字符。否则可能会导致缓冲区溢出,产生未定义的行为。

  2. null 结尾符strcat 函数会在目标字符串 dest 的结尾 null 字符的位置开始追加 src 指向的字符串。因此,追加后的结果仍然以 null 结尾。

  3. 安全性:使用 strcat 函数时,应确保 dest 指向的目标字符串足够大,且确保 src 指向的字符串以 null 结尾

4.strcmp

strcmp - C++ Reference

strcmp 函数是用于比较两个字符串的内容是否相同。它同样定义在 <string.h> 头文件中。

函数原型:int strcmp(const char *str1, const char *str2);

参数:str1:要比较的第一个字符串的指针。str2:要比较的第二个字符串的指针。

返回值:如果 str1 和 str2 的内容相同,则返回值为 0。如果 str1 的内容大于 str2 的内容,则返回正值。如果 str1 的内容小于 str2 的内容,则返回负值。

使用示例:

模拟其实现代码如下:

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

注意事项

  1. null 结尾符strcmp 函数会比较 str1str2 指向的字符串,直到遇到 null 结尾符为止。

  2. 大小写敏感strcmp 是区分大小写的,即大写字母和小写字母被视为不同的字符。

  3. 安全性:使用 strcmp 函数时,应确保 str1str2 都是以 null 结尾的有效字符串,否则可能会导致未定义的行为。

5.strstr

strstr - C++ Reference

strstr 函数用于在一个字符串中搜索指定子字符串的第一次出现,并返回一个指向该子字符串的指针。它同样定义在 <string.h> 头文件中。

函数原型:char *strstr(const char *haystack, const char *needle);

参数:haystack:要搜索的主字符串,即被搜索的字符串。needle:要查找的子字符串,即要搜索的目标字符串。

返回值:如果 needle 存在于 haystack 中,则返回一个指向 needle 在 haystack 中第一次出现的位置的指针。如果 needle 不存在于 haystack 中,则返回 NULL

使用示例:

模拟其实现代码如下:

char* my_strstr(const char*str1, const char* str2) {assert(str1 && str2);const char* s1 = str1;const char* s2 = str2;const char* p = str1;while(*p){s1 = p;s2 = str2;while (*s1 == *s2 && str1!='\0' && str2!='\0') {s1++;s2++;}	if (*s2 == '\0') {return p;}p++;}return NULL;
}


注意事项

  1. 大小写敏感strstr 函数是区分大小写的,即大写字母和小写字母被视为不同的字符。

  2. 空字符串:如果 needle 是一个空字符串 (""),则 strstr 函数将返回 haystack 的起始地址,因为任何字符串都包含空字符串。

  3. 安全性:确保 haystackneedle 都是以 null 结尾的有效字符串。

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

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

相关文章

一篇就够了,为你答疑解惑:锂电池一阶模型-在线参数辨识(附代码)

锂电池一阶模型-在线参数辨识 背景在线 VS 离线 参数辨识递推最小二乘法一阶戴维南Z域离散表达式 背景 锂电池一阶戴维南等效模型的基础知识和离线辨识方法&#xff0c;已经在上一期非常详细地讲解了一轮&#xff08;上期文章请戳此处&#xff09;&#xff0c;本期继续讲解一下…

【数据结构】经典链表题目详解集合(反转链表、相交链表、链表的中间节点、回文链表)

文章目录 一、反转链表1、程序详解2、代码 二、相交链表1、程序详解2、代码 三、链表的中间节点1、程序详解2、代码 四、回文链表1、程序详解2、代码 一、反转链表 1、程序详解 题目&#xff1a;给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链…

理解注意力机制与多头注意力:深度学习中的“聚焦术”

Attention 理解注意力机制与多头注意力&#xff1a;深度学习中的“聚焦术”什么是注意力机制&#xff1f;**核心思想** 什么是多头注意力机制&#xff1f;**工作原理** **多头注意力的优势****应用领域****结论** 理解注意力机制与多头注意力&#xff1a;深度学习中的“聚焦术”…

MLIR

方言 简介操作块区域值范围Control Flow and SSACFG Regions 操作与多区域&#xff08;Operations with Multiple Regions&#xff09;闭包&#xff08;Closure&#xff09;图形区域&#xff08;Graph Regions&#xff09;参数和结果&#xff08;Arguments and Results&#xf…

vscode编辑keil工程

1.编码问题 通常keil默认amsi格式&#xff0c;vscode默认utf-8格式&#xff0c;直接打开会出现乱码问题。 解决过程&#xff1a; 1.想着创建keil阶段&#xff0c;就使用utf-编码格式。 在区域设置里面“选择beta版&#xff0c;提供全球utf-8 提供全球语言支持”&#xff0c…

JVM专题之内存模型以及如何判定对象已死问题

体验与验证 2.4.5.1 使用visualvm **visualgc插件下载链接 :https://visualvm.github.io/pluginscenters.html https://visualvm.github.io/pluginscenters.html **选择对应JDK版本链接--->Tools--->Visual GC** 2.4.5.2 堆内存溢出 * **代码** java @RestCont…

从0制作自己的ros导航小车(01、准备工作)

@TOC 前言 本篇说明需要具备的知识和软硬件。可以不用全部具备,但基础要有,写的不是非常详细。 本小车分为上位机与下位机两部分,上位机使用旭日x3派运行ros进行开发和算法实现,下位机使用stm32驱动底盘和传感器数据采集。 一、知识 ①stm32部分(当然也可以使用其它控制…

uniapp/Android App上架三星市场需要下载所需要的SDK

只需添加以下一个权限在AndroidManifest.xml <uses-permission android:name"com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY"/>uniapp开发的&#xff0c;需要在App权限配置中加入以上的额外权限&#xff1a;

1958.力扣每日一题7/7 Java(100%解)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 首先将指定位…

游戏开发面试题5

什么是进程、线程、协程 进程 进程是计算机的一种基本运行单位&#xff0c;由操作系统管理资源和分配资源的基本单位&#xff0c;进程可以理解为一个正在运行的程序 线程 线程是计算机的一种独立执行单元&#xff0c;是操作系统能够进行运算调度的基本单位&#xff0c;线程之间…

排序 -- 手撕归并排序(递归和非递归写法)

一、基本思想 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有…

汉诺塔与青蛙跳台阶

1.汉诺塔 根据汉诺塔 - 维基百科 介绍 1.1 背景 最早发明这个问题的人是法国数学家爱德华卢卡斯。 传说越南河内某间寺院有三根银棒&#xff0c;上串 64 个金盘。寺院里的僧侣依照一个古老的预言&#xff0c;以上述规则移动这些盘子&#xff1b;预言说当这些盘子移动完毕&am…

SpringMVC(2)——controller方法参数与html表单对应

controller方法参数与html表单对应 0. User实体类 import org.springframework.format.annotation.DateTimeFormat;import java.io.Serializable; import java.util.Date; import java.util.List; import java.util.Map;public class User implements Serializable {private …

ES7210高性能四通道音频ADC转换模拟麦克风为IIS数字咪头

特征 高性能多位 Delta-Σ 音频 ADC 102 dB 信噪比 -85 分贝 THDN 24 位&#xff0c;8 至 100 kHz 采样频率 I2S/PCM 主串行数据端口或从串行数据端口 支持TDM 256/384Fs、USB 12/24 MHz 和其他非标准音频系统时钟 低功耗待机模式 应用 麦克风阵列 智能音箱 远场语音捕获 订购…

微服务的分布式事务解决方案

微服务的分布式事务解决方案 1、分布式事务的理论模型1.1、X/Open 分布式事务模型1.2、两阶段提交协议1.3、三阶段提交协议 2、分布式事务常见解决方案2.1、TCC补偿型方案2.2、基于可靠性消息的最终一致性方案2.3、最大努力通知型方案 3、分布式事务中间件 Seata3.1、AT 模式3.…

人工智能在软件开发中的角色:助手还是取代者?

人工智能在软件开发中的角色&#xff1a;助手还是取代者&#xff1f; 随着科技的飞速发展&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在软件开发领域的应用越来越广泛。从代码生成、错误检测到自动化测试&#xff0c;AI工具正成为开发者的重要助手。然而&#xf…

Postgresql - 用户权限数据库

1、综述 在实际的软件项目开发过程中&#xff0c;用户权限控制可以说是所有运营系统中必不可少的一个重点功能&#xff0c;根据业务的复杂度&#xff0c;设计的时候可深可浅&#xff0c;但无论怎么变化&#xff0c;设计的思路基本都是围绕着用户、部门、角色、菜单这几个部分展…

Django QuerySet对象,filter()方法

filter()方法 用于实现数据过滤功能&#xff0c;相当于sql语句中的where子句。 filter(字段名__exact10) 或 filter(字段名10)类似sql 中的 10 filter(字段名__gt10) 类似SQL中的 >10 filter(price__lt29.99) 类似sql中的 <29.99 filter(字段名__gte10, 字段名__lte20…

程序升级bootloader

文章目录 概述什么是bootloader&#xff1f;为什么用&#xff1f;bootloader启动流程图步骤 下载过程代码获取本地配置信息获取主机传过来的配置信息bootloader发送2给上位机&#xff0c;上位机发送文件给bootloader根据网站复制CRC 烧写flasherase启动编译问题 概述 用keil编…

声明队列和交换机 + 消息转换器

目录 1、声明队列和交换机 方法一&#xff1a;基于Bean的方式声明 方法二&#xff1a;基于Spring注解的方式声明 2、消息转换器 1、声明队列和交换机 方法一&#xff1a;基于Bean的方式声明 注&#xff1a;队列和交换机的声明是放在消费者这边的&#xff0c;这位发送的人他…