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

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; } 这里使用了递归的方法&#xff08;不创建新的变量&#xff0…...

畅阅读微信小程序

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

RHEL7(RedHat红帽)软件安装教程

目录 1、下载RHEL7镜像 2、安装RedHat7 注&#xff1a;如果以下教程不想看&#xff0c;可以远程控制安装V:OYH-Cx330 【风险告知】 本人及本篇博文不为任何人及任何行为的任何风险承担责任&#xff0c;图解仅供参考&#xff0c;请悉知&#xff01;本次安装图解是在一个全新的演…...

CC 攻击:一种特殊的 DDoS 攻击

引言 分布式拒绝服务&#xff08;Distributed Denial of Service&#xff0c;简称 DDoS&#xff09;攻击是指攻击者利用多台计算机或其他网络资源对目标发起大量请求&#xff0c;使目标服务器不堪重负&#xff0c;无法正常响应合法用户的请求。CC&#xff08;Challenge Collap…...

掌上高考爬虫逆向分析

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

忘了SD吧,现在是Flux的时代

Stable Diffusion大量人员离职&#xff0c;不过离职后核心人员依然从事相关工作&#xff0c;Flux就是SD的原班人马创作的。 在SD3后推出不久&#xff0c;Flux横空出世。 可以说&#xff0c;优秀的Flux和付费版的MJ效果相差不大&#xff08;前提是配置足够高&#xff0c;能进行…...

服务器安装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&#xff1f; RedisSearch 是一个基于 Redis 的搜索引擎模块&#xff0c;它提供了全文搜索、索引和聚合功能。通过 RedisSearch&#xff0c;可以为 Redis 中的数据创建索引&#xff0c;执行复杂的搜索查询&#xff0c;并实现高级功能&#xff0c;如自动完…...

提升工作效率神器

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

统信服务器操作系统【targetcli部署】

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

I2C中继器TCA9517A(TI)

一、芯片介绍 本芯片是一款具有电平转换功能的双向缓冲器&#xff0c;适用于I2C和SMBus系统&#xff0c;同时支持各种拓扑结构的扩展使用。芯片支持SCL和SDA缓冲&#xff0c;因此允许两条总线的负载电容达到400pF。 TCA9517A的A和B侧驱动器是不同的&#xff0c;但是均可耐受5…...

基于单片机的智能电话控制系统设计

摘要: 为了能够使用电话实现电器设备的控制,文中通过单片机及双音多频解码集成电路,使用用 户通过电话输入相应的指令就能够实现远程设备的智能化控制。文章主要对系统的构成、软件及 硬件设计进行了简单的介绍,并且对其中的电路进行了简单的说明,比如语音提示、双音频解…...

Go 综合题面试题

1. Golang 中 make 和 new 的区别&#xff1f; #make 和 new 都用于内存分配1&#xff1a;接收参数个数不一样&#xff1a; new() 只接收一个参数&#xff0c;而 make() 可以接收3个参数2&#xff1a;返回类型不一样&#xff1a; new() 返回一个指针&#xff0c;而 make() 返回…...

【Python报错已解决】AttributeError: ‘Tensor‘ object has no attribute ‘kernel_size‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…...

Spring MVC 参数校验 总结

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

【图像压缩与重构】基于BP神经网络

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

数据结构--单链表创建、增删改查功能以及与结构体合用

一、作业要求 单链表操作&#xff0c;要求节点是结构体类型&#xff0c;实现以下功能&#xff1a; 1.尾插学生 2.任意位置插入学生 3.任意位置删除学生 4.逆置单链表 5.学生按学号排序 6.销毁单链表 二、实现过程 1.代码如下&#xff1a; &#xff08;1&#xff09;头…...

开源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 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 请求方法别名 为了方便起见&#x…...

cpp中的namespace详解

namespace的作用主要是为了避免名字冲突和组织代码。 命名空间在C中是一个非常重要的特性&#xff0c;它帮助开发者更好地管理代码和避免潜在的冲突。 具体来说&#xff0c;它有以下几个主要用途 避免名字冲突 在大型项目中可能会有很多个类、函数或变量使用相同的名称。使用…...

MCUXpresso for VS Code集成J-Link脚本的三种工程化方法详解

1. 项目概述&#xff1a;为什么要在IDE里折腾脚本&#xff1f;如果你是一位使用NXP MCU的嵌入式开发者&#xff0c;大概率对MCUXpresso IDE和SEGGER J-Link调试器这对黄金搭档不陌生。在传统的MCUXpresso IDE&#xff08;基于Eclipse&#xff09;里&#xff0c;通过图形界面配置…...

LRC Maker终极指南:5分钟掌握专业级歌词制作技巧

LRC Maker终极指南&#xff1a;5分钟掌握专业级歌词制作技巧 【免费下载链接】lrc-maker 歌词滚动姬&#xff5c;可能是你所能见到的最好用的歌词制作工具 项目地址: https://gitcode.com/gh_mirrors/lr/lrc-maker 你是否曾经为喜爱的歌曲找不到完美同步的歌词而烦恼&am…...

QQ音乐解析工具终极指南:如何轻松获取全网音乐资源

QQ音乐解析工具终极指南&#xff1a;如何轻松获取全网音乐资源 【免费下载链接】MCQTSS_QQMusic QQ音乐解析 项目地址: https://gitcode.com/gh_mirrors/mc/MCQTSS_QQMusic 你是否厌倦了音乐平台的层层限制&#xff1f;想要畅听所有歌曲却不想支付高昂的会员费&#xff…...

终极指南:如何用Python实现手机号反查QQ号的3种高效方法

终极指南&#xff1a;如何用Python实现手机号反查QQ号的3种高效方法 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 在数字身份管理日益复杂的今天&#xff0c;你是否遇到过忘记某个手机号绑定了哪个QQ账号的困扰&#xff1f;或者需…...

C++中如何调用C语言的代码实现

为什么要是用 extern "C"在进行C开发的时候&#xff0c;由于C、C编译规则是不同的。C编译函数方法是 使用mangle的技术 。123456789101112void func(int age) {}void func(int age, int height) {}/*如果有这两个函数要被调用&#xff0c;在C语言中函数重载是不允许的…...

思源宋体TTF字体包:为什么专业设计师都选择它?7大应用场景深度解析

思源宋体TTF字体包&#xff1a;为什么专业设计师都选择它&#xff1f;7大应用场景深度解析 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为中文排版烦恼吗&#xff1f;字体选择困…...

【无人机三维路径规划】基于遗传算法GA实现复杂山地环境下无人机三维路径规划研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

深入解析PCI中断路由:从硬件引脚到操作系统中断处理的完整链路

1. 项目概述与核心问题在计算机硬件系统里&#xff0c;中断机制是设备与处理器高效通信的生命线。它允许设备在需要处理器服务时&#xff0c;主动“打断”处理器当前的工作流&#xff0c;而不是让处理器不断地去“询问”设备的状态。对于PCI&#xff08;Peripheral Component I…...

嘎嘎降AI和去AIGC深度对比:2026年按次计费和按篇计费哪个更划算完整评测分析

嘎嘎降AI和去AIGC深度对比&#xff1a;2026年按次计费和按篇计费哪个更划算完整评测分析 总有人问嘎嘎降AI&#xff0c;这篇文章把主流几款对比清楚。 综合推荐嘎嘎降AI&#xff08;www.aigcleaner.com&#xff09;&#xff0c;4.8元&#xff0c;99.26%达标率。不同需求有不同…...

Linux密钥文件管理排查方法

Linux密钥文件管理排查方法本文面向具备一定 Linux 基础的技术人员&#xff0c;围绕密钥文件管理展开&#xff0c;重点讨论敏感文件权限、轮换流程和审计追踪。在中级运维和系统管理工作中&#xff0c;这类主题常常与配置变更、资源状态、权限边界、自动化任务和业务影响交织在…...