[C语言]手动实现strcat strcmp strcpy strstr strtok(静态全局指针初始化方式)代码

strcat strcmp strcpy strstr strtok这些代码均存储在c语言的头文件<string.h>中,如果要使用的话直接调用即可,但是为了增加我们对代码的理解,我们看一下如何手动实现这些代码吧!

strcat

strcat是在字符串后面增加上自己想要增加的内容,我们要注意以下三点

源字符串必须以 '\0' 结束。

目标空间必须有足够的大,能容纳下源字符串的内容。

目标空间必须可修改。

按照这个逻辑我们来试试写strcat的代码吧

#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* pdest = dest;while (*dest)//找到结束字符{dest++;}while (*dest++ = *src++);//进行后面的增加拷贝return pdest;
}int main()
{char a[30] = {"I love coding"};char b[] = "I love too";printf("%s\n", my_strcat(a, b));return 0;
}

strcmp

strcmp是两个字符进行比较

标准规定:

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

一个字符串等于第二个字符串,则返回0

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

实现方法如下

#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* x,const char* y)
{assert(x && y);while (*x && *y){if (*x != *y){return(int)(*x - *y);}x++;y++;}return (int)(*x - *y);
}void main()
{char a[] = "ab0efd";char b[] = "ab0eed";if (my_strcmp(a, b) > 0){printf("a>b");}else if (my_strcmp(a, b) < 0){printf("a<b");}else{printf("a=b");}
}

strcpy

strcpy是字符串拷贝的代码必须要注意的是

源字符串必须以 '\0' 结束。

会将源字符串中的 '\0' 拷贝到目标空间。

目标空间必须足够大,以确保能存放源字符串。

目标空间必须可变。

//模拟实现strcpy
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{char* pdest = dest;assert(dest && src);while (*dest++ = *src++){;}return pdest;
}int main()
{char a[20] = "I love coding";char b[20] = { 0 };printf("%s", my_strcpy(b, a));return 0;
}

strstr

strstr是在字符串中找字符串如果找到了就返回找到的地址

//模拟实现strstr
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* str1,const char* str2)
{assert(str1 && str2);const char* s1 = str1;const char* s2 = NULL;const char* sflag = NULL;if (*str2 == '0'){return str1;}do {sflag = s1;s2 = str2;while ((*sflag == *s2)&&*sflag&&*s2){if (*(s2+1) == '\0'){return (sflag);}sflag++, s2++;}} while (*s1++);return 0;
}
int main()
{char a[] = "aaasdfasdfqw";char b[] = "sdf";char* ret = my_strstr(a, b);if (ret == 0){printf("没有找到");}else{printf("找到了\n");printf("%s\n", ret);}return 0;
}

strtok

strtok是按照自己想要的格式来切割字符串

规定char * strtok ( char * str, const char * sep );

其中sep参数是个字符串,定义了用作分隔符的字符集合

第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记

strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。

如果字符串中不存在更多的标记,则返回 NULL 指针

这里我们需要每次保留上一次数据指向的位置,怎么样保存呢?我们可以设一个静态指针,方法代码实现如下;

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
#include<string.h>char* my_strtok(const char* str1,const char* str2)
{assert(str2);static char* flag;//将局部变量定义为全局变量if (str1){flag = str1;}if (flag == NULL || *flag == '\0'){return NULL;}char* first_str = flag;char* cp = str2;while (*flag){cp = str2;while (*cp) //寻找是否有需要切割的字符{if (*flag != *cp){cp++;}else{*flag++ = '\0';return(first_str);}}flag++;}return(first_str);
}void main()
{char a[] = "www.4399@qq.com";char temp[20];strcpy(temp, a);char b[] = ".@";char* ret;for (ret = my_strtok(temp, b);ret; ret = my_strtok(NULL, b)){printf("%s\n", ret);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/762080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Postgresql数据库入门简介

Postgresql入门 1.Postgresql数据库简介 PostgresQL是一个功能强大的开源数据库系统。经过长达15年以上的积极开发和不断改进&#xff0c;PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。目前PostgreSql可以运行在所有主流操作系统上&#xff0c;包括Linux…

WebGIS管线在线编辑器(电力、水力、燃气、热力、热能管线)

随着GIS等信息技术的发展&#xff0c;地下管线管理也从二维平面向三维立体管理迈进。传统管线信息管理系统将管线及其附属设施抽象成二维平面内的点、要素&#xff0c;并使用各类点符号、不同颜色线段进行表达。虽能一定程度上满足城市智慧运行的需要&#xff0c;但不能很直观的…

分布式锁简单实现

分布式锁 Redis分布式锁最简单的实现 想要实现分布式锁&#xff0c;必须要求 Redis 有「互斥」的能力&#xff0c;我们可以使用 SETNX 命令&#xff0c;这个命令表示SET if Not Exists&#xff0c;即如果 key 不存在&#xff0c;才会设置它的值&#xff0c;否则什么也不做。 …

mpyboard开发板使用REPL

文章目录 WindowsMacOS XLinux使用REPL提示符重启开发板 REPL是指交互式解释器&#xff08;Read Evaluate Print Loop&#xff09;&#xff0c;就是一种命令输入交互模式&#xff0c;可以使用命令行的方式与pyboard进行交互。REPL是测试代码和运行命令最简单的方式之一&#xf…

Premiere模板|200个视频标题文字动画pr字幕模板包

Premiere模板&#xff0c;13个类别200个Pr视频标题字幕文字动画模板mogrt包。 几乎适用于任何场景。粗体标题&#xff0c;标注&#xff0c;未来主义和线条标题&#xff0c;下三分之一&#xff0c;霓虹灯&#xff0c;带数字的标题&#xff0c;倒计时&#xff0c;表格&#xff0c…

【爬虫】Selenium打开新tab页截图并关闭

如果说 你曾苦过我的甜 我愿活成你的愿 愿不枉啊 愿勇往啊 这盛世每一天 山河无恙 烟火寻常 可是你如愿的眺望 孩子们啊 安睡梦乡 像你深爱的那样 &#x1f3b5; 王菲《如愿》 在自动化测试和网页抓取中&#xff0c;Selenium WebDriver 是一个强大的工具&…

【Mock|JS】Mock的get传参+获取参数信息

mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…

【RH134问答题】第十三章 运行容器(下)

系列文章 第一章 提高命令行生产效率 第二章 计划将来的任务 第三章 调优系统性能 第四章 使用ACL控制对文件的访问 第五章 管理SELinux安全性 第六章 管理基本存储 第七章 管理逻辑卷 第八章 实施高级存储功能 第九章 访问网络附加存储 第十章 控制启动过程 第十一章 管理网络…

每天学习一个Linux命令之passwd

每天学习一个Linux命令之passwd 简介 passwd是Linux下用于修改用户密码的命令。它允许系统管理员或用户修改自己的密码&#xff0c;提供了很多选项以满足不同的需求。 命令选项 passwd命令有以下可用选项&#xff1a; -a&#xff1a;显示密码的更改时间和上一次更改密码的…

画图软件diawio

Draw.io | 一款强大且支持在线编辑和导出的流程图绘制神器-CSDN博客 draw.io 免费 好用的流程图绘制软件 - 知乎 (zhihu.com) draw.io (drawio.com)

复试专业前沿问题问答合集7-2——神经网络与强化学习

复试专业前沿问题问答合集7-2——神经网络与强化学习 神经网络与强化学习相关的基础知识问答 Q1: 什么是人工神经网络(Artificial Neural Networks, ANN)? A1: 人工神经网络是一种模仿生物神经网络行为的计算模型,由大量相互连接的人工神经元组成。每个神经元接收输入,…

26. 删除有序数组中的重复项 (Swift版本)

题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你删除重复出现的元素&#xff0c;使每个元素只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0…

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SAO-B…

ENISA 2023年威胁态势报告:主要发现和建议

欧盟网络安全局(ENISA)最近发布了其年度2023年威胁态势报告。该报告确定了预计在未来几年塑造网络安全格局的主要威胁、主要趋势、威胁参与者和攻击技术。在本文中&#xff0c;我们将总结报告的主要发现&#xff0c;并提供可操作的建议来缓解这些威胁。 介绍 ENISA 威胁态势报告…

CVX安装新版本Mosek求解器

在使用连续凸近似&#xff08;SCA&#xff09;求解优化问题时遇到了报错 Problem status : ILL_POSED Solution status : PRIMAL_ILLPOSED_CER并且最后给出的结果为NaN。 在CVX论坛中找到一条回答 具体链接如下&#xff1a; The status is failed 因为我使用的是CVX自带的…

垃圾回收-垃圾回收中的相关概念

目录 System.gc()的理解 内存泄漏&#xff08;Memory Leak&#xff09; 内存溢出&#xff08;OOM&#xff09; Stop The World 垃圾回收的串行、并行与并发 安全点与安全区域 强、软、弱、虚引用 强、软、弱、虚引用 终结器引用 System.gc()的理解 在默认情况下&#…

嵌入式驱动学习第四周——设备树

前言 掌握设备树是 Linux 驱动开发人员必备的技能&#xff01;因为在新版本的 Linux 中&#xff0c;ARM 相关的驱动全部采用了设备树。本篇博客重点介绍一下设备树与设备树语法。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本…

Vue3的与2的简单区别

Vue2选项式api Vue3组合式API setup方法的使用&#xff0c;最后需要return setup语法糖省略了内部的export default{} 和return 内容 以及组件的注册 reactive生成响应式对象&#xff0c;只能适用于复杂对象&#xff0c;简单类型不可 ref生成响应式数据&#xff1a;复杂类型和简…

电商平台客户反馈的数据分析与应用

目录 写在开头1 客户反馈对产品改进的作用1.1 发现产品存在的问题1.2 提供改进的方向1.3 增强用户参与感 2 数据分析在客户反馈处理中的应用2.1 客户反馈内容的文本分析2.2 情感分析与趋势识别2.3 客户反馈的归类和优先级排序2.4 挖掘隐藏信息 3. 利用客户反馈改进电商运营的案…

详细剖析多线程(更新中...)

文章目录 前言一、认识线程1.1线程概念1.2为什么要有线程1.3线程和进程的区别&#xff08;经典面试题&#xff09; 二、创建线程2.1继承 Thread 类,重写run2.2实现 Runnable 接口,重写run2.3继承 Thread 类,重写run&#xff0c;匿名内部类2.4实现 Runnable 接口,重写run&#x…