str函数的模拟(包括strn函数的模拟)
首先先说这些函数引用的头文件是<string.h>
1.strlen函数
int my_strlen(char* s1) {
//这里只用最难的方法
if (*s1) {
return my_strlen(s1 + 1) + 1;
}
else
return 0;
}
这里使用了递归的方法(不创建新的变量),如果需要看指针,数组用计数器count(创建新变量)的方法看之前发的文章string函数的模拟即可;
讲解一下这个函数的作用:这个函数能求解'\0'之前元素个数,直到找到'\0',如果找不到就会生成随机数。
注意点:这些str函数返回值一般都是unsigned int 类型,但是我的模拟函数都是返回int型,如果用库函数的话,做减法要注意不会出现负值。
2.strcpy函数
void my_strcpy(char* s1, const char* s2) {
assert(s1 && s2);
while (*s1++ = *s2++)//这里可以刚好把’\0‘给拷贝过去然后出来
;
}
该函数的功能就是将一个字符串的内容进行拷贝到另一个字符串,为啥不直接使用赋值呢?
char str[20]="abcd";
str="abcd";这样是错误的,因为现在的str代表的是字符串首元素的地址,是没办法直接进行赋值的;
注意:要看好传入的是啥,前面的是要拷贝的位置,后面那个是要拷贝内容的地址;
3.strcat函数
void my_strcat(char* s1, const char* s2) {
assert(s1 && s2);
while (*s1++)
;
s1--;
while (*s1++ = *s2++)
;
}
该函数的作用是将一段字符串加在另外一段字符串的后面;
4.strstr函数
char* my_strstr(const char* s1, const char* s2) {
while (*s1) {
char* p = s1;
char* new_s2 = s2;
while (*p == *new_s2 && *new_s2 != '\0' && *p != '\0') {
p++;
new_s2++;
}
if (*new_s2 == '\0') {
return s1;
}
s1++;
}
return NULL;
}
这个函数的作用是判断是否为字串后,返回开始符合字串到结尾所在的所有剩余字符;
6.strtok函数
#define _CRT_SECURE_NO_WARNINGS 1//不加上会报错
int main() {
char str1[] = "www.baidu@com";
char* str = "@.";
char* ret = NULL;
char str2[20] = {0};
strcpy(str2, str1);
ret = strtok(str2, str);
printf("%s\n", ret);
ret = strtok(NULL, str);
printf("%s\n", ret);
ret = strtok(NULL, str);
printf("%s\n", ret);
ret = strtok(NULL, str);
printf("%s\n", ret);
return 0;
}
strtok有两种机制:
1.如果strtok不为NULL,那么会保存@的位置(@会被改成\0)
2.如果strtok为 NULL,那么会从上次strtok所保存@的位置,继续往下找seq中的字符,如果找到,接着分割。最后再保存被改成\0的位置。
最后:如果strtok找到了没被改的\0,也就是字符串末尾的\0时,返回NULL。
7.strncpy函数
char* my_strncpy(char* s1, const char* s2,int count) {
assert(s1&& s2);
char* s1_new = s1;
while (count && (*s1_new++ = *s2++) != '\0') {
count--;
}
if (count) {
while (--count) {//这里先减减是因为上面在离开循环的时候已经处理过一次了,但是没有count--;这样处理之后循环能少一次
*s1_new++ = '\0';
}
}
return s1;
}
这个函数可以确定控制要拷贝的个数,如果供给拷贝的字符串短于要拷贝的个数,剩余的使用'\0'进行补充。
8.strncat函数
char* my_strncat(char* s1, const char* s2, int count) {
assert(s1 && s2);
char* start = s1;
while (*s1++)
;
s1--;
while (count--) {
if ((*s1++ = *s2++) == '\0')
return (start);
}
*s1 = '\0';
return (start);
}
这个的逻辑是加到出现'\0'就直接return离开,如果还没有出现'\0'最后给截止的'\0'再离开,返回的是一个字符串首元素的地址。
相关文章:
str函数的模拟(包括strn函数的模拟)
首先先说这些函数引用的头文件是<string.h> 1.strlen函数 int my_strlen(char* s1) { //这里只用最难的方法 if (*s1) { return my_strlen(s1 1) 1; } else return 0; } 这里使用了递归的方法(不创建新的变量࿰…...

畅阅读微信小程序
畅阅读微信小程序 weixin051畅阅读微信小程序ssm 摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用j…...

RHEL7(RedHat红帽)软件安装教程
目录 1、下载RHEL7镜像 2、安装RedHat7 注:如果以下教程不想看,可以远程控制安装V:OYH-Cx330 【风险告知】 本人及本篇博文不为任何人及任何行为的任何风险承担责任,图解仅供参考,请悉知!本次安装图解是在一个全新的演…...
CC 攻击:一种特殊的 DDoS 攻击
引言 分布式拒绝服务(Distributed Denial of Service,简称 DDoS)攻击是指攻击者利用多台计算机或其他网络资源对目标发起大量请求,使目标服务器不堪重负,无法正常响应合法用户的请求。CC(Challenge Collap…...

掌上高考爬虫逆向分析
目标网站 aHR0cHM6Ly93d3cuZ2Fva2FvLmNuL3NjaG9vbC9zZWFyY2g/cmVjb21zY2hwcm9wPSVFNSU4QyVCQiVFOCU4RCVBRg 一、抓包分析 二、逆向分析 搜索定位加密参数 本地生成代码 var CryptoJS require(crypto-js) var crypto require(crypto);f "D23ABC#56"function v(t…...

忘了SD吧,现在是Flux的时代
Stable Diffusion大量人员离职,不过离职后核心人员依然从事相关工作,Flux就是SD的原班人马创作的。 在SD3后推出不久,Flux横空出世。 可以说,优秀的Flux和付费版的MJ效果相差不大(前提是配置足够高,能进行…...
服务器安装openssh9.9p1
11.81.2.19 更新 SSL 备份原有配置 1.1 查看 openssl 版本 openssl version OpenSSL 1.0.2k-fips 26 Jan 20171.2 查看 openssl 路径 whereis openssl openssl: /usr/bin/openssl /usr/lib64/openssl /usr/include/openssl /usr/share/man/man1/openssl.1ssl.gz1.3 备份 op…...

Spring Boot集成Redis Search快速入门Demo
1.什么是Redis Search? RedisSearch 是一个基于 Redis 的搜索引擎模块,它提供了全文搜索、索引和聚合功能。通过 RedisSearch,可以为 Redis 中的数据创建索引,执行复杂的搜索查询,并实现高级功能,如自动完…...

提升工作效率神器
这五款软件让你事半功倍 在当今快节奏的社会中,提高工作效率成为了每个人追求的目标。而在这个数字化时代,选择对的软件工具无疑是提高效率的关键。今天,我为大家推荐五款优秀的工作效率软件,帮助你在工作中事半功倍。 1、亿可达…...

统信服务器操作系统【targetcli部署】
targetcli部署方案 文章目录 功能概述功能介绍1.安装targetcli2.targetcli语法及参数说明3.示例1. 配置2.访问功能概述 SCSI 即小型计算机系统接口(Small Computer System Interface;简写:SCSI) iSCSI,internet SCSI 网络磁盘 ,提供一对一的网络存储, 主机A 提供xx存储设…...

I2C中继器TCA9517A(TI)
一、芯片介绍 本芯片是一款具有电平转换功能的双向缓冲器,适用于I2C和SMBus系统,同时支持各种拓扑结构的扩展使用。芯片支持SCL和SDA缓冲,因此允许两条总线的负载电容达到400pF。 TCA9517A的A和B侧驱动器是不同的,但是均可耐受5…...
基于单片机的智能电话控制系统设计
摘要: 为了能够使用电话实现电器设备的控制,文中通过单片机及双音多频解码集成电路,使用用 户通过电话输入相应的指令就能够实现远程设备的智能化控制。文章主要对系统的构成、软件及 硬件设计进行了简单的介绍,并且对其中的电路进行了简单的说明,比如语音提示、双音频解…...

Go 综合题面试题
1. Golang 中 make 和 new 的区别? #make 和 new 都用于内存分配1:接收参数个数不一样: new() 只接收一个参数,而 make() 可以接收3个参数2:返回类型不一样: new() 返回一个指针,而 make() 返回…...

【Python报错已解决】AttributeError: ‘Tensor‘ object has no attribute ‘kernel_size‘
🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 专栏介绍 在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

Spring MVC 参数校验 总结
1. 简介 Sping MVC提供了参数校验的方便注解。 2.代码 在pom.xml中添加依赖: <dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>8.0.0.Final</version&g…...

【图像压缩与重构】基于BP神经网络
课题名称:基于BP神经网络的图像压缩与重构(带GUI) 相关资料: 1. 代码注释 2.BP神经网络原理文档资料 3.图像压缩原理文档资料 程序实例截图:...

数据结构--单链表创建、增删改查功能以及与结构体合用
一、作业要求 单链表操作,要求节点是结构体类型,实现以下功能: 1.尾插学生 2.任意位置插入学生 3.任意位置删除学生 4.逆置单链表 5.学生按学号排序 6.销毁单链表 二、实现过程 1.代码如下: (1)头…...

开源ids snort (windows版)
Snort-IPS-on-Windows-main资源-CSDN文库 GitHub - eldoktor1/Snort-IPS-on-Windows: A comprehensive guide to installing and configuring Snort IPS on Windows, ensuring robust network security 手动打造Snortbarnyard2BASE可视化告警平台 - FreeBuf网络安全行业门户 …...
关于 vue3 axios的封装,并发请求相关
简介 Axios 是一个基于 promise 网络请求库,作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 请求方法别名 为了方便起见&#x…...
cpp中的namespace详解
namespace的作用主要是为了避免名字冲突和组织代码。 命名空间在C中是一个非常重要的特性,它帮助开发者更好地管理代码和避免潜在的冲突。 具体来说,它有以下几个主要用途 避免名字冲突 在大型项目中可能会有很多个类、函数或变量使用相同的名称。使用…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...