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;并返回反转后的链…

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 思路 首先将指定位…

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

一、基本思想 归并排序&#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.…

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;这位发送的人他…

Dynamic Web Module facet version问题

The default superclass, "javax.servlet.http.HttpServlet", according to the projects Dynamic Web Module facet version (3.1), was not found on the Java Build Path. 1.右键项目 2.点击Properties 3.点击Java Build Path&#xff0c;右边找到Libraries&…

大模型在营销领域的探索及创新

1 AIGA介绍 2 AIGA在营销领域的 应用和探索 3 总结与展望

docker-compose Install gitlab 17.1.1

gitlab 前言 GitLab 是一个非常流行的开源 DevOps 平台,用于软件开发项目的整个生命周期管理。它提供了从版本控制、持续集成/持续部署(CI/CD)、项目规划到监控和安全的一系列工具。 前提要求 Linux安装 docker docker-compose 参考Windows 10 ,11 2022 docker docker-c…

(ECCV,2022)Mask-CLIP:从CLIP中提取自由密集标签

文章目录 Extract Free Dense Labels from CLIP相关资料摘要引言方法Mask-CLIPMask-CLIP 实验 Extract Free Dense Labels from CLIP 相关资料 代码&#xff1a;https://github.com/chongzhou96/MaskCLIP 论文&#xff1a;https://arxiv.org/abs/2112.01071 摘要 对比语言-…

SprongBoot及其基础应用全套部署脚本和配置

POM.xml配置 </dependencies> <!--skywalking日志监控依赖--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.5.0</version></dependency&g…

【周末闲谈】AI“抢饭碗”?绝对不是危言耸听

AI是在帮助开发者还是取代他们? 在软件开发领域,生成式人工智能(AIGC)正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试,AI工具正在成为开发者的得力助手。然而,这也引发了对开发者职业前景和技能需求变化的讨论。AI究竟是在帮助开发者还是取代他们?…

2024组装一台能跑AI大模型的电脑

title: 2024组装一台能跑AI大模型的电脑 tags: [组装电脑, AI大模型] categories: [其他, 电脑, windows] 这里不写组装步骤&#xff0c;哪里接线&#xff0c;购买什么品牌网上一大堆。 这里只写如何根据你自己的需求&#xff0c;选择合适的、兼容的配件。 概述 需求&#xff…