当前位置: 首页 > 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的热力图可视化的…...

用C语言解决‘换硬币’问题?我来教你如何调试和验证你的循环逻辑

用C语言解决‘换硬币’问题&#xff1f;我来教你如何调试和验证你的循环逻辑 当你第一次面对"换硬币"这类组合问题时&#xff0c;那种既兴奋又困惑的感觉我至今记忆犹新。作为C语言初学者&#xff0c;理解多重循环的运作机制就像在迷宫中寻找出口——每次你以为找到了…...

亚马逊卖家公开信息数据提取:反爬攻防战与 Python 批量采集实战

摘要&#xff1a; 批量获取亚马逊&#xff08;Amazon&#xff09;第三方卖家的商业名称、信用代码和注册地址等信息&#xff0c;对于跨境 B2B 拓客和供应链分析具有重要意义。然而&#xff0c;亚马逊的 Cloudflare 盾和 Robot 验证码构成了极高的反爬门槛。本文将深度解析亚马逊…...

硬件答辩问题总结

一、电源纹波是什么&#xff0c;为什么LDO的小&#xff0c;DCDC的大1.电源纹波电源纹波 是指直流电源输出电压上叠加的 交流波动成分&#xff0c;表现为电压在理想直流值附近上下波动。2.LDO 纹波小原理LDO 内部是一个 调整管&#xff08;可变电阻&#xff09; 串联在输入和输出…...

SkillVLA:通过技能复用应对双-臂操纵中的组合多样性

26年3月来自新加坡国立、北京中关村学院、上海创新研究院、上海AI实验室、上海交大和复旦的论文“SkillVLA: Tackling Combinatorial Diversity in Dual-Arm Manipulation via Skill Reuse”。 视觉-语言-动作&#xff08;VLA&#xff09;模型近期取得的进展&#xff0c;已充分…...

基于ESP32的智能电池充电器设计:多化学体系支持与模块化架构

1. 项目概述&#xff1a;打造一台全能的“电池医生”手头攒了一堆不同化学体系的电池&#xff0c;从航模用的4S锂聚合物电池&#xff0c;到应急灯里的12V铅酸电池&#xff0c;再到各种工具里的镍氢、锂离子电池&#xff0c;每次充电都得翻出好几个不同的充电器&#xff0c;桌面…...

保姆级教程:Windows系统下Arcgis 10.2从下载、安装到汉化一次搞定(附常见License启动失败解决方案)

Windows系统下Arcgis 10.2完整安装与汉化实战指南第一次接触Arcgis的新手往往会被复杂的安装流程和神秘的License Manager搞得晕头转向。作为一款功能强大的地理信息系统软件&#xff0c;Arcgis在科研、城市规划、环境监测等领域有着广泛应用&#xff0c;但它的安装过程确实会让…...

Godot4 2D游戏开发避坑指南:TileMap绘制、节点顺序与相机设置的三个常见问题

Godot4 2D游戏开发避坑指南&#xff1a;TileMap绘制、节点顺序与相机设置的三个常见问题当你第一次用Godot4完成一个2D场景搭建时&#xff0c;那种成就感往往会被几个突如其来的bug瞬间击碎——角色神秘消失、背景纹丝不动、屏幕边缘出现诡异黑边。这些问题看似简单&#xff0c…...

从零到上机:我的第一个Quest 3空间锚点应用是如何跑起来的(附完整Unity工程)

从零到上机&#xff1a;我的第一个Quest 3空间锚点应用是如何跑起来的&#xff08;附完整Unity工程&#xff09;第一次戴上Meta Quest 3时&#xff0c;那种虚拟与现实交织的震撼感至今难忘。但作为开发者&#xff0c;更让我着迷的是如何让虚拟物体在真实空间中"记住"…...

论文润色深度测评:GPT-5.5 + Gemini 3.1 Pro:教你学会1+1>2的论文润色方法

各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。 2026年的科研圈,AI工具的选择已经从有没有变成了强不强,七哥评测了GPT…...

谷氨酸发酵过程的软测量建模【附模型】

✨ 长期致力于软测量、谷氨酸发酵、动力学模型、支持向量机、高斯过程、变量选择、异常状态研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;多阶段高斯…...