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

C语言中常用的字符串处理函数(strlen、strcpy、strcat、strcmp)

文章目录

  • 写在前面
  • 1. strlen
    • 1.1 函数介绍
    • 1.2 模拟实现
  • 2. strcpy
    • 2.1 函数介绍
    • 2.2 模拟实现
  • 3. strcat
    • 3.1 函数介绍
    • 3.2 模拟实现
  • 4. strcmp
    • 4.1 函数介绍
    • 4.2 模拟实现

写在前面

本篇文章介绍了C语言中常用的字符串处理函数,包括strlen、strcpy、strcat和strcmp。文章中,对这几个函数进行了详细的解释和示例演示,并进行了模拟实现。

1. strlen

1.1 函数介绍

函数原型:

size_t strlen ( const char * str );
  • str:要计算长度的字符串的指针。

strlen函数是一个用于计算字符串长度的函数,它从指定的字符串起始位置开始,逐个字符地计算,直到遇到字符串结尾的 \0 为止。它返回的是字符串中\0之前的字符个数,不包括\0。
关于strlen需要注意以下几点:

  • 参数指向的字符串必须要以 \0结束,否则strlen求得的结果是未知的。
  • 注意函数的返回值为size_t,是无符号的( 易错)。

以下代码,展示了如何使用 strlen 函数来计算字符串的长度:

#include <stdio.h>
#include <string.h>int main() {const char* str = "Hello World!";size_t len = strlen(str);printf("字符串长度:%d\n", len);return 0;
}

1.2 模拟实现

strlen函数的模拟实现(3种方法):

  1. 递归求字符串长度。
#include <stdio.h>
#include <assert.h>size_t my_strlen(const char* str)
{assert(str);if (*str == '\0'){return 0;}return 1 + my_strlen(str+1);	
}int main() {const char* str = "Hello World!";size_t len = my_strlen(str);printf("字符串长度:%d\n", len);return 0;
}
  1. 计数器方法求字符串长度。
#include <stdio.h>
#include <assert.h>size_t my_strlen(const char* str)
{assert(str);size_t count = 0;while (*str++){count++;}return count;
}int main() {const char* str = "Hello World!";size_t len = my_strlen(str);printf("字符串长度:%d\n", len);return 0;
}
  1. 指针 - 指针求字符串长度。
#include <stdio.h>
#include <assert.h>size_t my_strlen(const char* str)
{assert(str);const char* _str = str;while (*str){str++;}return str - _str;
}int main() {const char* str = "Hello World!";size_t len = my_strlen(str);printf("字符串长度:%d\n", len);return 0;
}

2. strcpy

2.1 函数介绍

函数原型:

char * strcpy ( char * destination, const char * source );
  • destination:目标字符串的指针,即将源字符串的内容复制到这个字符串中。
  • source:源字符串的指针,即要复制的字符串。

strcpy是一个用于完成字符串拷贝的函数,函数将源字符串的内容复制到目标字符串中,直到遇到源字符串的结尾的 \0 为止。复制完成后,函数返回目标字符串的起始地址。
关于strcpy需要注意以下几点:

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变

以下代码,展示了如何使用 strcpy 函数来完成字符串拷贝:

#include <stdio.h>
#include <string.h>int main()
{char dest[20];//目标字符串数组const char* src = "hello word!";//源字符串//使用strcpy函数,将源字符串拷贝到目标字符串strcpy(dest, src);printf("目标字符串:%s\n", dest);return 0;
}

2.2 模拟实现

strcpy模拟实现:

  • 使用循环遍历 src 字符串中的每个字符。
  • 在循环中,将 src 字符串的每个字符复制到 dest 字符串的对应位置,包括结尾的 \0。
  • 循环直到遇到 src 字符串的 \0,然后结束循环。
  • 返回 dest字符串的起始地址,表示复制完成。
#include <stdio.h>
#include <assert.h>
//模拟实现
char* my_strcpy(char* dest, const char* src)
{assert(dest && src);//保留目标字符串起始地址char* _dest = dest;//逐个字符进行拷贝while (*dest++ = *src++){;}return _dest;
}
int main()
{char dest[20];const char* src = "hello word!";my_strcpy(dest, src);printf("目标字符串:%s\n", dest);return 0;
}

3. strcat

3.1 函数介绍

函数原型:

char * strcat ( char * destination, const char * source );
  • destination:目标字符串的指针,即要将源字符串追加到这个字符串的末尾。
  • source:源字符串的指针,即要追加到目标字符串末尾的字符串。

strcat是一个用于完成字符串追加的函数,它将源字符串的内容追加到目标字符串的末尾,直到遇到源字符串的 \0 为止。追加完成后,函数返回目标字符串的起始地址,并且目标字符串将包含原始内容以及追加内容,且以结尾\0 结束。
关于strcat需要注意以下几点:

  • 源字符串必须以 ‘\0’ 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。

以下代码,展示了如何使用 strcat 函数来追加字符串:

#include <stdio.h>
#include <string.h>int main() {char dest[20] = "Hello, ";const char* src = "World!";  // 源字符串// 使用 strcat 追加源字符串到目标字符串strcat(dest, src);printf("目标字符串:%s\n", dest);return 0;
}

3.2 模拟实现

strcat模拟实现:
实现思路:

  • 使用循环找到 dest字符串中 \0 的位置。
  • 使用循环,将 src字符串的每个字符从dest字符串\0的位置依次往后追加(包括src中\0),直到遇到 src 字符串中的 \0。
  • 返回 dest字符串的起始地址,表示追加完成。
#include <stdio.h>
#include <assert.h>
//模拟实现
char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* _dest = dest;//找末尾\0while (*dest){dest++;}//从目标字符串\0位置开始往后追加while (*dest++ = *src++){;}return _dest; 
}int main()
{const char* src = "word!";// 源字符串char dest[30] = "hello ";my_strcat(dest, src);printf("%s\n", dest);return 0;
}

4. strcmp

4.1 函数介绍

函数原型:

int strcmp ( const char * str1, const char * str2 );
  • str1:要比较的第一个字符串的指针。
  • str2:要比较的第二个字符串的指针。

strcmp 是一个字符串比较函数,用于比较两个字符串的内容。该函数返回一个整数值,表示比较的结果。
标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字。
  • 第一个字符串等于第二个字符串,则返回0。
  • 第一个字符串小于第二个字符串,则返回小于0的数字。

关于strcmp需要注意以下几点:

  • strcmp 函数是区分大小写的,因此大写字母和小写字母被认为是不同的字符。
  • 在比较字符串时,要确保字符串以\0 结尾,否则可能会导致未定义行为。

以下代码,展示了如何使用 strcmp 函数来进行字符串比较:

#include <stdio.h>
#include <string.h>int main() {const char *str1 = "abcdef";const char *str2 = "abcdeg";int res = strcmp(str1, str2);if (res < 0) {printf("%s 小于 %s\n", str1, str2);} else if (res == 0){printf("%s 等于 %s\n", str1, str2);} else {printf("%s 大于 %s\n", str1, str2);}return 0;
}

4.2 模拟实现

strcmp模拟实现:
实现思路:

  • 使用循环遍历 str1 和 str2 字符串中的每个字符,同时比较它们的对应字符。如果同时遍历到\0的位置循环都没结束,表示两个字符串相等,返回0。
  • 在循环中,如果发现字符不相等,则返回它们的差值(ASCII码值之差)。
#include <stdio.h>
#include <assert.h>
//模拟实现
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);//使用循环遍历 str1 和 str2,同时比较它们的对应字符while (*str1 == *str2){if (*str1 == '\0'){return 0;}str1++;str2++;}//发现字符不相等,则返回它们的差值return *str1 - *str2;
}int main() {const char *str1 = "abcdeg";const char *str2 = "abcdef";int res = my_strcmp(str1, str2);if (res < 0){printf("%s 小于 %s\n", str1, str2);}else if (res == 0){printf("%s 等于 %s\n", str1, str2);}else {printf("%s 大于 %s\n", str1, str2);}return 0;
}

至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !
在这里插入图片描述

相关文章:

C语言中常用的字符串处理函数(strlen、strcpy、strcat、strcmp)

文章目录 写在前面1. strlen1.1 函数介绍1.2 模拟实现 2. strcpy2.1 函数介绍2.2 模拟实现 3. strcat3.1 函数介绍3.2 模拟实现 4. strcmp4.1 函数介绍4.2 模拟实现 写在前面 本篇文章介绍了C语言中常用的字符串处理函数&#xff0c;包括strlen、strcpy、strcat和strcmp。文章…...

Suricata – 入侵检测、预防和安全工具

一、Suricata介绍 Suricata是一个功能强大、用途广泛的开源威胁检测引擎&#xff0c;提供入侵检测 (IDS)、入侵防御 (IPS) 和网络安全监控功能。它执行深度数据包&#xff08;网络流量&#xff09;检查以及模式匹配&#xff0c;在威胁检测中非常强大。 工作流程&#xff1a; 主…...

vscode 乱码解决

windows 10 系统 vs code 编译运行和调试 C/C_vscode windows编译_雪的期许的博客-CSDN博客 VS Code默认文件编码时UTF-8&#xff0c;这对大多数情况是没有问题的&#xff0c;却偏偏对C/C有问题。如果以UTF-8编码保存C/C代码&#xff0c;那么只能输出英文&#xff0c;另外使用…...

SpringCloud(37):Spring Cloud Alibaba 综合集成架构演示

Spring Cloud是一个较为全面的微服务框架集,集成了如服务注册发现、配置中心、消息总线、负载均衡、断路器、API网关等功能实现。而在网上经常会发现Spring Cloud与阿里巴巴的Dubbo进行选择对比,这样做其实不是很妥当,前者是一套较为完整的架构方案,而Dubbo只是服务治理与R…...

【单片机】15-AD和DA转换

1.AD转换及其相关背景知识 1.基本概念 1.什么是AD转换&#xff1f; A&#xff08;A&#xff0c;analog&#xff0c;模拟的&#xff0c;D&#xff0c;digital&#xff0c;数字的&#xff09; 现实世界是模拟的&#xff0c;连续分布的&#xff0c;无法被分成有限份&#xff1b;…...

基于FPGA的I2C读写EEPROM

文章目录 前言一、I2C协议1.1 I2C协议简介1.2 物理层1.3 协议层 二、EEPROM2.1 型号及硬件规格2.2 各种读写时序 三、状态机设计四、项目源码&#xff1a;五、实现效果参考资料 前言 本次项目所用开发板FPGA芯片型号为&#xff1a;EP4CE6F17C8 EEPROM芯片型号为&#xff1a;24L…...

Viva Employee Communications Communities部署方案

目录 Viva Employee Communications & Communities产品介绍 1. 沟通中心(Communications Center) 2. 新闻和公告(News and Announcements)...

WPF向Avalonia迁移(三、项目结构)

前提&#xff1a; Avalonia版本11.0.0 1.配置文件 1.1 添加配置文件 1.2 读取配置文件 添加System.Configuration.ConfigurationManager using Avalonia.Controls; using System.Configuration;namespace AvaloniaApplication7.Views {public partial class MainWindow : W…...

cvpr24写作模板pdfLaTex编译器注意点小结

文章目录 1 更改作者显示 Anonymous CVPR submission2 \label标签3 换行符// 与换列符&4 \medskip5 首行缩进6 插入图片6.1 单幅图片6.2 并排显示\hfill Reference https://cvpr.thecvf.com/Conferences/2024 1 更改作者显示 Anonymous CVPR submission 这一行开头加上% …...

windows版php扩展包下载

php8有些扩展需自己下载&#xff0c;像redis 看下phpinfo中的PHP Extension Build&#xff0c;确定自己的php版本 windows.php.net - /downloads/pecl/releases/...

计算机竞赛 题目:基于深度学习的中文汉字识别 - 深度学习 卷积神经网络 机器视觉 OCR

文章目录 0 简介1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的中文汉字识别 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &a…...

Django跨域访问 nginx转发 开源浏览器

Django跨域访问 https://blog.csdn.net/lonelysnowman/article/details/128086205 nginx转发 https://blog.csdn.net/faye0412/article/details/75200607/ 开源浏览器 https://www.oschina.net/p/chromiumengine 浏览器油猴开发 https://blog.csdn.net/mukes/article/detail…...

Docker Alist 在线网盘部署

文章目录 拉取镜像创建并运行查看容器自动生成的密码在浏览器中进行访问 挂载本地磁盘 拉取镜像 docker pull xhofe/alist-aria2创建并运行 # -v /data/alist:/opt/alist/data 挂载本地目录 docker run -d --restartalways -v /data/alist:/opt/alist/data -p 5244:5244 -e P…...

Jmeter吞吐量控制器使用小结

吞吐量控制器(Throughput Controller)场景: 在同一个线程组里, 有10个并发, 7个做A业务, 3个做B业务,要模拟这种场景,可以通过吞吐量模拟器来实现.。 添加吞吐量控制器 用法1: Percent Executions 在一个线程组内分别建立两个吞吐量控制器, 分别放业务A和业务B 吞吐量控制器采…...

3分钟轻松实现网关网口连接罗克韦尔AB CompactLogix系列PLC

目录 EG网关网口连接罗克韦尔AB CompactLogix系列PLC 一. 准备工作 1.1 在对接前我们需准备如下物品 1.2 EG20网关准备工作 1.3 PLC准备工作 二. EMCP平台设置 2.1 新增EG设备 2.2 远程配置网关 2.3 网关绑定 2.4 通讯参数设置 2.5 创建设备驱动 2.5.1 添加变量 2.…...

vscode刷leetcode使用Cookie登录

1、打开vscode&#xff0c;选择扩展&#xff0c;搜索leetcode&#xff0c;选择第一个&#xff0c;带有中文力扣字样&#xff0c;安装后重启 2、选择这个小球&#xff0c;切换中文版本&#xff0c;切换后&#xff0c;会显示一个打勾 3、选择小球旁边的有箭头的小门&#xff0…...

每次启动Docker容器指定IP、hosts和端口

每次启动Docker容器指定IP、hosts和端口 1问题描述1解决办法1.1启动容器指定好IP、hostname、端口等信息1.2通过docker-compose启动容器&#xff0c;可以配置extra_hosts属性1.3通过k8s来管理容器&#xff0c;则在可以在创建pod的yaml文件通过hostAliases添加域名IP映射 2问题描…...

PL/SQL增量同步

PL/SQL全量同步_枯河垂钓的博客-CSDN博客 目录 增量同步 增量同步存储过程 ORACEL 独有的 增量更新 merge into 增量同步 逻辑: 用源表的数据更新目标表,数据存在则更新,数据不存在,则插入 实现的逻辑: 1. 首先判断目标表是否有源表的数据 2. 如果有,则用源表的数据更新…...

C++——多态底层原理

虚函数表 先来看这个问题&#xff1a; class Base { public: virtual void Func1() { cout << "Func1()" << endl; } private: int _b 1; }; sizeof(Base)是多少&#xff1f; 答案是&#xff1a;8 因为Base中除了成员变量_b,还有一个虚函数表_vfp…...

asdTools-ReID热力图可视化

文章首发见博客&#xff1a;https://mwhls.top/4869.html。 无图/格式错误/后续更新请见首发页。 更多更新请到mwhls.top查看 欢迎留言提问或批评建议&#xff0c;私信不回。 Github - 开源代码及Readme Blog - 工具介绍 摘要&#xff1a;基于TorchCam实现ReID的热力图可视化的…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...