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.xdnf.cn/news/1472966.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA 对象存储OSS工具类(腾讯云)

对象存储OSS工具类 import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObj…

重塑通信边界,基于ZYNQ7000 FPGA驱动的多频段多协议软件无线电平台

01、产品概述 本平台是基于高性能ZYNQ-7000系列中的XC7Z045处理器构建的多频段多协议软件无线电解决方案&#xff0c;集成了AD9364芯片——一款业界领先的1x1通道RF敏捷收发器&#xff0c;为无线通信应用提供了强大支持。其存储架构包括2路高速4GB DDR3内存、1路32GB EMMC存储以…

龙迅#LT8642UXE适用于四路HDMI转两路HDMI切换应用功能,分辨率高达4K60HZ!

1. 概述 LT8642UXE HD-DVI2.0/1.4 交换机具有符合 HD-DVI2.0/1.4 规范的 4&#xff1a;2 交换机、最大 6Gbps 高速数据速率、自适应均衡接收输入和预加重 TX 输出&#xff0c;以支持长电缆应用。 LT8642UXE HD-DVI2.0/1.4 开关自动检测电缆损耗&#xff0c;并自适应优化均衡设置…

第二轮复习 408 操作系统(概述)

第二轮复习 408 操作系统&#xff08;概述&#xff09; 操作系统的概述操作系统的目标与特征操作系统发展历程 操作系统的运行环境处理器运行模式中断和异常的概念系统调用操作系统结构操作系统引导 操作系统的概述 操作系统是控制和管理整个计算机系统的硬件与软件管理整个计…

JMH320【亲测】【御剑九歌】唯美仙侠手游御剑九歌+WIN学习手工端+视频教程+开服清档+运营后台+授权GM物品充值后台

资源介绍&#xff1a; 这也是仙梦奇缘的一个游戏 注意&#xff1a;外网14位IP或域名 ———————————————————————————————————– ps后台介绍: 1区运营后台&#xff1a;http://ip:9981/admin/admintool/ 2区运营后台&#xff1a;http://ip…

识别 Spring Cloud 配置文件的规则:Nacos, Bootstrap, Application

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

redis哨兵系统框架部署

redsi主从配置 下面是基于redis主从的环境部署哨兵模式 1、在配置好redis主从后&#xff0c;添加哨兵模式需要在sentinel.conf文件添加一条命令(主从节点都需要添加) mymaster 是主节点的别名。192.168.25.129 是主节点的 IP。6379 是主节点的端口。2 是仲裁值&#xff0c;表…

遗漏知识点

什么是RAII&#xff1f; RAII是Resource Acquisition Is Initialization&#xff08;wiki上面翻译成 “资源获取就是初始化”&#xff09;的简称&#xff0c;是C语言的一种管理资源、避免泄漏的惯用法。利用的就是C构造的对象最终会被销毁的原则。RAII的做法是使用一个对象&am…

Day05-组织架构-角色管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-编辑部门-弹出层获取数据2.组织架构-编辑部门-编辑表单校验3.组织架构-编辑部门-确认取消4.组织架构-删除部门5.角色管理-搭建页面结构6.角色管理-获取数…

网络数据传输中的封装与解封装详解

注&#xff1a;机翻&#xff0c;未校对。 The goal of networks is to transmit data from one host to another. 网络的目标是将数据从一个主机传输到另一个主机。 Encapsulation 封装 To achieve this goal, each layer adds its own header to the data. A header contain…

Vue2基础 14:自定义指令

自定义指令 1 函数式1.1 案例--v-text放大10倍 2 对象式2.1 案例--v-fbind默认获取焦点&#xff08;函数式&#xff09;2.2 案例--v-fbind默认获取焦点&#xff08;对象式&#xff09; 3 自定义指令容易犯的错4 全局指令写法&#xff08;参考过滤器写法&#xff09;&#xff1a…

跟《经济学人》学英文:2024年07月06日这期 Central banks are winning the battle against inflation

Central banks are winning the battle against inflation. But the war is just getting started Politics and protectionism will make life difficult 原文&#xff1a; The trajectory of inflation has not given central bankers much cause for celebration in rece…

android2024 gradle8 Processor和ksp两种编译时注解实现

android编译时注解&#xff0c;老生常谈&#xff0c;外面的例子都是bindView&#xff0c;脑壳看疼了&#xff0c;自己学习和编写下。 而且现在已经进化到kotlin2.0&#xff0c;google也逐渐放弃kapt&#xff0c;进入维护状态。所以要好好看看本贴。 参考我的工程&#xff1a; h…

gda动态调试-cnblog

忽的发现gda有动态调试功能 动态监听返回值 框柱指定方法&#xff0c;选择调试方法&#xff0c;gda会自动监听函数的返回值&#xff0c;例如 自定义frida脚本 gda会自动生成hook该函数的frida脚本

zigbee笔记:六、看门狗定时器(Watch Dog)

一、看门狗基础 1、看门狗功能&#xff1a; 由于单片机的工作常常会受到来自外界电磁场的干扰&#xff0c;造成各种寄存器和内存的数据混乱&#xff0c;会导致程序指针错误等&#xff0c;程序运行可能会陷入死循环。程序的正常运行被打断&#xff0c;由单片机控制的系统无法继…

kafka系列之消费后不提交offset情况的分析总结

概述 每当我们调用Kafka的poll()方法或者使用KafkaListener(其实底层也是poll()方法)时&#xff0c;它都会返回之前被写入Kafka的记录&#xff0c;即我们组中的消费者还没有读过的记录。 这意味着我们有一种方法可以跟踪该组消费者读取过的记录。 如前所述&#xff0c;Kafka的一…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十)-git(2)

下面是一些git的常用命令和基本操作&#xff0c;可以当做平常的笔记查询&#xff0c;用于学习&#xff01;&#xff01;&#xff01; 文章目录 前言 一、git 二、git常用命令 总结 前言 下面是一些git的常用命令和基本操作&#xff0c;可以当做平常的笔记查询&#xff0c;用于…

解决前后端同一个端口跨域问题

前端起了一个代理 如果url是api开头的自动代理访问8080端口&#xff08;解决前后端端口不一致要么是前端代理&#xff0c;要么是后端加过滤器&#xff09; proxy:{/api:{target:http://localhost:8080,changeOrigin : true,// 替换去掉路径上的api// rewrite:(path)>path.r…

配置基于不同端口的虚拟主机

更改配置文件&#xff0c;添加三个不同端口的虚拟主机 <directory /www> allowoverride none require all granted </directory><virtualhost 192.168.209.136:80> documentroot /www servername 192.168.209.136 </virtualhost><virtualhost 192.…

【python基础】—如何理解安装程序时要配置Widows和DOS操作系统中的path环境变量?

文章目录 前言一、环境变量是什么&#xff1f;二、为什么需要设置环境变量&#xff1f;三、配置anaconda的环境变量 前言 在安装一些程序的时候&#xff0c; 我们总是需要将安装路径配置到正在使用电脑的环境变量里。为什么要进行这一步呢&#xff1f;本文主要解释Widows和DOS…