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

解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)

今天也是去学习了一波字符串函数,想着也为了加深记忆,所以写一下这篇博客。既帮助了我也帮助了想学习字符串函数的各位。下面就开始今天的字符串函数的学习吧。

目录

strcpy与strncpy

 strcat与strncat

strcmpy

strstr


strcpy与strncpy

在 C 语言中, strcpy 函数用于将一个字符串复制到另一个字符串中,并返回目标字符串的指针。该函数的原型如下:
 
 

char* strcpy(char *dest, const char *src);


 
 
其中, dest 表示目标字符串的指针, src 表示源字符串的指针。 strcpy 函数会将源字符串的内容复制到目标字符串中,并在复制结束后返回目标字符串的指针。
 

以下是一个简单的 strcpy 函数的模拟实现:
 
 

#define _CRT_SECURE_NO_WARNINGS 1
#include<assert.h>
char* My_strcopy(char* dest,const char* src)
{                                                                                                                                                                                                                                                                                                                                                                                                                                                                           char* ret = dest;assert(dest != NULL);assert(src!=NULL);while(*dest++ = *src++);return ret;
}


 
 
在这个模拟实现中,我们首先检查目标字符串和源字符串是否为空指针,如果为空指针则返回空指针。然后,我们使用一个循环将源字符串的内容逐个复制到目标字符串中。最后,返回目标字符串的指针。
 
需要注意的是,这个模拟实现只适用于源字符串和目标字符串的长度较小的情况。在实际使用中,建议使用标准库中的 strcpy 函数,以确保代码的可移植性和正确性。                                                                                                                                                                                                                                                                                                                                                                                                           


这样可能又有人问那我不想全部复制过去,我只想赋值前n个字符串那怎么实现呢?其实在这个库函数也有人创造出来过了,它就是strncpy,它也就比strcpy多一个n。下面是其解析与模拟与解析:

strncpy 函数是 C 语言中的内置函数之一,相较于 strcpy 函数,它使用更加灵活,功能更加强大。strncpy 函数将字符串源的前  num  个字符复制到目标字符串中,返回目标字符串的指针。它的语法形式为:

 char *strncpy(char *destination, const char *source, size_t num) 


 
需要注意的是, strncpy 函数在复制字符串时,不会在目标字符串的末尾添加空字符  '\0' ,除非源字符串的长度小于  num 。如果源字符串的长度大于等于  num ,则会将源字符串的前  num  个字符复制到目标字符串中。如果源字符串的长度小于  num ,则会将源字符串的所有字符复制到目标字符串中,并在目标字符串的末尾添加  num  减源字符串长度个空字符  '\0' 。
 
下面是一个简单的  strncpy  函数的模拟实现:
 
 

char* My_strncpy(char* dest, const char* src, int num)
{char* tmp = dest;while (num && (*dest++ = *src++))num--;if (num)while (num--)*dest++ = '\0';return tmp;
}
int main()
{int num = 0;char arr1[10] = { '\0' };char arr2[10] = { '\0' };printf("input?the?dest:>\n");gets(arr1);printf("input?the?scr:>\n");gets(arr2);printf("input?the?copy?num:>");scanf("%d", &num);char* ret = My_strncpy(arr1, arr2, num);printf("%s\n", ret);
}

 


 
在这个示例中,我们定义了一个  my_strncpy  函数来模拟  strncpy  函数的行为。在  my_strncpy  函数中,我们使用一个  while  循环来复制源字符串的字符到目标字符串中,直到复制的字符数达到  num  或者遇到源字符串的结束字符  '\0' 。然后,如果  num  不为零,我们使用另一个  while  循环将目标字符串的剩余部分填充为空字符  '\0' 。最后,我们返回目标字符串的指针。
 
在  main  函数中,我们定义了两个长度为10的字符数组  arr1  和  arr2 ,并使用  gets  函数获取用户输入的字符串。然后,我们使用  scanf  函数获取要复制的字符数,并调用  my_strncpy  函数将源字符串的前  num  个字符复制到目标字符串中。最后,我们使用  printf  函数输出复制后的目标字符串。
 


 strcat与strncat

strcat 函数和 strncat 函数都是 C 语言标准库中的字符串操作函数,用于字符串的拼接和拷贝,下面是对它们的解析与模拟实现:
 
1.  strcat 函数:
 
- 函数声明: char *strcat(char *strDestination, const char *strSource) 。
- 函数功能:将源字符串拼接到目标字符串的末尾,并返回拼接后的目标字符串的首地址。
- 注意事项:目标字符串的空间必须足够大,且以 \0 结尾,源字符串必须以 \0 结尾,拼接后的字符串末尾也会自动添加 \0 。

- 模拟实现:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char * my_strcat(char * dest, const char * src)
{assert(dest);assert(src);char * ret = dest;while (*dest)dest++;while (*dest++ = *src++);return ret;
}
int main()
{char a[20] = "abcd";char b[5] = "efgh";my_strcat(a, b);printf("%s\n", a);system("pause");return 0;
}


 

2.  strncat 函数:
 
- 函数声明: char *strncat(char *strDestination, const char *strSource, size_t count) 。
- 函数功能:将源字符串的前 count 个字符拼接到目标字符串的末尾,并返回拼接后的目标字符串的首地址。
- 注意事项:目标字符串的空间必须足够大,且以 \0 结尾,源字符串必须以 \0 结尾, count 表示需要拼接的字符个数,如果 count 大于源字符串的长度,则拼接有效字符后,在目标字符串末尾添加 \0 ;如果 count 小于源字符串的长度,则拼接有效字符后,在目标字符串末尾添加 \0 。

- 模拟实现:
 

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char* my_strncat(char* dest, const char* src, size_t count)
{assert(dest);assert(src);char* ret = dest;while (*dest)dest++;while (count--){if (*src)*dest++ = *src++;elsebreak;}*dest = '\0';return ret;
}
int main()
{char a[20] = "abc";char b[5] = "efgh";my_strncat(a, b, 3);printf("%s\n", a);system("pause");return 0;
}

 


 
当然,上述代码只是一种模拟实现,真正的 strcat 和 strncat 函数会对参数进行更严格的检查,并处理各种边界情况,以确保程序的稳定性和安全性。


strcmpy

 strcmp 是一个用于比较字符串大小的函数,其函数原型为 

int strcmp(const char *str1, const char *str2) 

该函数会将两个字符串中的字符一个一个比较直到一方比另一方大或者小,若直到 '\0' 都相等则会返回0。注意其返回值:

第一个大于第二个 返回大于0的数字 
 第一个等于第二个 返回等于0的数字 
 第一个小于第二个 返回小于0的数字
 

以下是一个 strcmp 函数的模拟实现:

 
// 模拟实现 
int My_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return (*str1 - *str2);
}int main()
{int ret = 0;char str1[10] = "dijshdf";char str2[10] = "fuhdsud";ret=My_strcmp(str1, str2);printf("%d\n", ret);return 0;
}


代码解析:首先使用 const 对 str1 和 str2 进行修饰保护,并对 str1 与 str2 进行断言保护,然后使用循环并解引用 str1 和 str2 并判断其是否相等,如果相等则循环继续, str1++ 并且 str2++ 直到遇到 '\0' ,此时返回0;若发现 str1 与 str2 解引用后不相等则返回 *str1-*str2 。


strstr

 strstr 函数的作用是在一个字符串(str1)中查找另一个字符串(str2)的首次出现位置,并返回该位置的指针。其函数原型为

 char*strstr(char*str1, const char*str2)

 

以下是对该函数的解析与模拟实现:
 
1. 函数解析:
 
-  str1 :被查找的目标字符串。
-  str2 :要查找的子字符串。
- 返回值:若 str2 是 str1 的子串,则返回 str2 在 str1 中首次出现的地址;如果 str2 不是 str1 的子串,则返回 NULL 。

 

2. 模拟实现:
 
 
 该函数返回子串在目标串中第一次出现的地址 

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 != '\0' && *s2 != '\0' && *s1 == *s2){s1++;s2++;}if (*s2 == '\0'){return (char*)p;}p++;}return NULL;
}int main()
{char arr1[] = "hello橘子真甜~";char arr2[] = "hello橘子";char* ret = My_strstr(arr1, arr2);if (ret == NULL){printf("子串不存在\n");}else {printf("字串存在:%s\n", ret);}return 0;
}


 
在上述代码中,首先使用 const 对 str1 和 str2 进行修饰保护,并对 str1 与 str2 进行断言保护,然后使用循环并解引用 str1 和 str2 并判断其是否相等,如果相等则循环继续, str1++ 并且 str2++ 直到遇到 '\0' ,此时返回 p 的地址;若发现 str1 与 str2 解引用后不相等则返回 NULL 。
 

 


文章已到篇尾,请各位多多支持。

相关文章:

解析与模拟常用字符串函数strcpy,strcat,strcmp,strstr(一)

今天也是去学习了一波字符串函数&#xff0c;想着也为了加深记忆&#xff0c;所以写一下这篇博客。既帮助了我也帮助了想学习字符串函数的各位。下面就开始今天的字符串函数的学习吧。 目录 strcpy与strncpy strcat与strncat strcmpy strstr strcpy与strncpy 在 C 语言中&…...

node.js后端+小程序前端+mongoDB(增删改查)

前言 今天我对比了以下node.js的express与python的fastAPI&#xff0c;我决定我还是出一期关于node.jsmangoDB小程序的小案例吧。 不是python的fastAPI不好用&#xff0c;因为fastAPI是python较新的技术&#xff0c;我不敢果断发出教学文章&#xff08;这件事情还是留着给pyt…...

thinkphp数据批量提交(群发消息)

<form id="edit-form" class="form-horizontal" role="form" data-toggle<...

大华 DSS 数字监控系统 attachment_getAttList.action SQL 注入漏洞复现

0x01 产品简介 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。 0x02 漏洞概述 大华 DSS存在SQL注入漏洞,攻击者 /portal/attachment_getAttList.action 路由发送特殊构造的数据包,利用报错注入获…...

vue2学习笔记(2/2)

vue2学习笔记&#xff08;1/2&#xff09; vue2学习笔记&#xff08;2/2&#xff09; 文章目录 1. 初始化脚手架2. 分析脚手架&render函数文件结构图示及说明main.jsindex.htmlApp.vueSchool.vueStudent.vue 关于不同版本的Vue修改默认配置vue.config.js配置文件 3. ref属…...

uniapp 之 base64转临时地址播放mp3

需求是&#xff1a;进入页面的时候是先有背景音乐&#xff0c;发送问题请求回答的时候会返回文字和音频&#xff0c;前端要把音频读出来&#xff0c;并且把背景音乐停止&#xff0c;读完音频后再打开背景音乐 一开始用的直接base64直接拼接在地址后 真机放不了 const innerAu…...

【网站项目】038汽车养护管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

倒计时64天

B-小红的因子数_牛客周赛 Round 31 (nowcoder.com) 超时了&#xff08;108.33/125&#xff09; #include <bits/stdc.h> using namespace std; const int N 1e5 5; const int inf 0x3f3f3f3f; #define int long long void solve() {int x;cin>>x;if(x1){cout&…...

003集—三调数据库添加三大类字段——arcgis

在国土管理日常统计工作中经常需要用到三大类数据&#xff08;农用地、建设用地、未利用地&#xff09;&#xff0c;而三调数据库中无三大类字段&#xff0c;因此需要手工录入三大类字段&#xff0c;并根据二级地类代码录入相关三大类名称。本代码可一键录入海量三大类名称统计…...

python基础使用之excel数据处理

当我们需要用python处理 Excel 表格数据时&#xff0c;Python 提供了一个强大的库pandas。pandas 是一个用于数据分析的开源 Python 库&#xff0c;它可以帮助我们轻松地读取、操作和分析 Excel 表格数据。下面通过一个实例&#xff0c;展示 pandas如何 来处理 Excel 表格数据的…...

【算法】【数据结构】算法与数据结构的关系

程序算法数据结构语言工具和环境 但在算法学习过程中&#xff0c;我认识到算法和数据结构是密不可分的&#xff0c;脱离数据结构谈论算法是空架子。 算法&#xff1a;解决问题的步骤和方法。对数据进行操作和处理的方法。 数据结构&#xff1a;用来存储数据的方式。 数据结构和…...

Libvirt 迁移标志详解

可参考&#xff1a;https://libvirt.org/html/libvirt-libvirt-domain.html#virDomainMigrateFlags 在虚拟化环境中&#xff0c;迁移是一项重要的功能&#xff0c;Libvirt 提供了一系列标志&#xff0c;用于控制迁移过程中的不同行为。以下是 virDomainMigrateFlags 枚举的详细…...

【数据分享】1929-2023年全球站点的逐月平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 之前我们分享过1929-2023年全球气象站点的逐月平均气温数据、逐月最高气温数据…...

NLP中的嵌入和距离度量

本文将深入研究嵌入、矢量数据库和各种距离度量的概念&#xff0c;并提供示例和演示代码。 NLP中的嵌入 嵌入是连续向量空间中对象、单词或实体的数值表示。在NLP中&#xff0c;词嵌入捕获词之间的语义关系&#xff0c;使算法能够更好地理解文本的上下文和含义。 让我们试着用…...

jsp教务管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教务管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…...

基恩士 KV-8000 PLC通讯简单测试

1、KV-8000通讯协议 基恩士 KV-8000 PLC支持多种通讯方式&#xff0c;包括&#xff1a;OPC UA、Modbus、上位链路命令等。其中OPC UA需要对服务器和全局变量进行设置&#xff0c;Modbus需要调用功能块。默认支持的是上位链路命令&#xff0c;实际是一条条以回车换行结束的ASCII…...

【高质量精品】2024美赛B题22页word版高质量半成品论文+多版保奖思路+数据+前四问思路代码等(后续会更新)

一定要点击文末的卡片&#xff0c;进入后&#xff0c;获取完整论文&#xff01;&#xff01; B 题整体模型构建 1. 潜水器动力系统失效&#xff1a;模型需要考虑潜水器在无推进力情况下的行为。 2. 失去与主船通信&#xff1a;考虑无法从主船接收指令或发送位置信息的情况。…...

apache_exporter安装说明

Apache Exporter 问题描述 需要监控apache服务&#xff0c;部署了apache_exporter&#xff0c;对过程进行一下记录。 源码参见apache_exporter ①下载 https://github.com/Lusitaniae/apache_exporter/releases②解压缩 tar -xzvf apache_exporter-0.7.0.linux-amd64.tar…...

代码随想录算法训练营29期Day42|卡码网46,LeetCode 416

文档讲解&#xff1a;背包问题二维 背包问题一维 分割等和子集 46.整数拆分 题目链接&#xff1a;https://kamacoder.com/problempage.php?pid1046 思路&#xff1a; 在一维dp数组中&#xff0c;dp[j]表示&#xff1a;容量为j的背包&#xff0c;所背的物品价值可以最大为d…...

java的excel列行合并模版

1.效果 2.模版 <tableborder"1"cellpadding"0"cellspacing"0"class"tablebor"id"TABLE"><tr align"center" class"bg217"><td style"background-color: #008000; color: #ffffff;p…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

计算机系统结构复习-名词解释2

1.定向&#xff1a;在某条指令产生计算结果之前&#xff0c;其他指令并不真正立即需要该计算结果&#xff0c;如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方&#xff0c;那么就可以避免停顿。 2.多级存储层次&#xff1a;由若干个采用不同实现技术的存储…...

Pandas 可视化集成:数据科学家的高效绘图指南

为什么选择 Pandas 进行数据可视化&#xff1f; 在数据科学和分析领域&#xff0c;可视化是理解数据、发现模式和传达见解的关键步骤。Python 生态系统提供了多种可视化工具&#xff0c;如 Matplotlib、Seaborn、Plotly 等&#xff0c;但 Pandas 内置的可视化功能因其与数据结…...

Spring Boot 与 Kafka 的深度集成实践(二)

3. 生产者实现 3.1 生产者配置 在 Spring Boot 项目中&#xff0c;配置 Kafka 生产者主要是配置生产者工厂&#xff08;ProducerFactory&#xff09;和 KafkaTemplate 。生产者工厂负责创建 Kafka 生产者实例&#xff0c;而 KafkaTemplate 则是用于发送消息的核心组件&#x…...