字符函数与字符串函数(2)

遇见她如春水映莲花

字符函数与字符串函数(2)

  • 前言
  • 一、strcat
    • strncat
  • 二、strcmp
    • strncmp
    • 在这里插入图片描述
  • 三、strstr
  • 四、strtok
  • 五、strerror
  • 总结


前言

根据上期字符函数与字符串函数我们可以了解到字符函数与个别字符串函数的用法,
那么接下来就开始对字符串函数的详细讲解(strcat、strcmp、strncpy、strncat、strncmp、strstr、


以下是本篇文章正文内容,下面案例可供参考

一、strcat

1.深刻理解函数:

在这里插入图片描述
destination是追加目的地址,而source则是要追加的内容
返回值:char*

2.功能实现:

示例:(strcat是用于函数的追加)
在这里插入图片描述

3:模拟代码:

#include<stdio.h>
#include<assert.h>
#include<string.h>
char* my_strcat(char* dest, const char* source)
{
	char* p = dest;
	assert(source);
	assert(dest);
	//1.先找到目标空间的‘\0’
	while (*dest)
	{
		dest++;
	}
	//2.追加数据
	while (*source)
	{
		*dest = *source;
		dest++;
		source++;
	}
	return  p;
}
int main()
{
	char arr[20] = "abcdef";
	char arr1[20] = "bbbb";
	my_strcat(arr, arr1);
	printf("%s", arr);
	return 0;
}

代码难度一般,还是很好理解的!!!

strncat

  1. 了解:strncat与strcat的区别

通过对比我们可以很好的看出他们之中差了个size_t num,而这个num作用是可以让你想追加多少个就追加多少个
追加的长度由你来控制,同时也起到保护的作用避免不必要的事故

2.功能实现:

在这里插入图片描述
这里的strncat追加是怎么追加的呢?
通过调试可以得出以下结果:
1:在打印的最后一位的下一位加个‘\0’
在这里插入图片描述
2:如果字符串的长度小于追加长度那么就只会追加字符串(如图所示)

在这里插入图片描述

二、strcmp

1.理解函数:

在这里插入图片描述
返回值:int(类型)
用const来保证指针charstr1和str2不被修改

2.功能实现

strcmp功能是用于字符串比较
比较过程是一个一个相比(如图所示)
在这里插入图片描述
---------------------那么strcmp怎么告诉你大小呢?

在这里插入图片描述

我们可以通过返回值来确定大小
如:
如果第一个字符大于另外一个数组的第一个字符那么就会返回(>0)
等于返回(=0)
小于返回(<0)

3.函数模拟实现

int my_strcmp(char* dest, const char* source)
{
	assert(dest);
	assert(source);
	while (*dest == *source)
	{
		dest++;
		source++;
	}
	if (*dest > *source)
	{
		return 1;
	}
	else
	{
	    return -1;
	}
}
int main()
{
	char arr[20] = "abcdef";
	char arr1[20] = "bsdjfhf";
	int ret = my_strcmp(arr1, arr);
	printf("%d", ret);

}

strncmp

1:理解函数

在这里插入图片描述
在这里插入图片描述
相差了size_t num也就是指定内容比较

2.实现函数

int main()
{
	char arr[] = "abcdef";
	char arr1[20] = "abcds";
	int ret = strncmp(arr, arr1, 4);
	printf("%d", ret);
}

在这里插入图片描述

三、strstr

1.了解函数

! [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F%2Fimgblog.csdnimg.cn%2Fdirect%2Fa01330c4fe3c4f8783283a698c5c7ea5.png&pos_id=img-490bqnMB1330c4fe3c4f878285a6933c5c4ea5.png7
功能:查找字符串
如:
this is a student. 要查找 is
输出:为 is is a student
在这里插入图片描述

代码如下:

int main()
{
	char arr[] = "this is a student";
	char arr1[] = "is";
    printf("%s",strstr(arr, arr1));
	return 0;
}

2.strstr功能模拟

函数模拟有3种场景
在这里插入图片描述
1.第一种情况
my_strstr(“abcdef”,“bcd”);
在这里插入图片描述
一个一个比较
如果不相等,你们str1往后走一步(以此类推)
但是只有俩个指针来遍历的话是不够的
于是我们得出:要专门有个指针记录开始匹配的位置
2.第二种情况
在这里插入图片描述
这会有一次复杂的过程,str1指向的一个b,与str2比较但是还是找不到,那么我们就要让str指向第二个b时又与str2进行比较(所以又要俩个指针一个记录str2的初始位置,一个记录str1初始位置)

char* my_strstr(const char* dest, const char* src)
{
	assert(dest);
	assert(src);

	if (*src == '\0')//不能传空地址
	{
		return (char*)dest;
	}
	//1.abcdef\0 查找   bcd\0


	//2.abbbcdef\0 查找  bbc\0
	//3.abcdef\0   查找    bbq\0

	char* p = dest;
	char* s = dest;
	char* s1 = src;
	while (*p)
	{
		s = p;
		s1 = src;
		while(*s!='\0'&&*s1!='\0'&& *s == *s1)
		{
			s++;
			s1++;
	    }
		if (*s1 == '\0')
		{
			return p;
		}
		p++;
	}
	return NULL;
}
int main()
{
	char arr[] = "this is a student";
	char arr1[] = "is";
    printf("%s",strstr(arr, arr1));
	return 0;
}

四、strtok

1.理解函数

在这里插入图片描述

当strtok进行过一次之后,他会保留俩个指针一个是初始指针(头个指针),另外一个就是所标记点位置指针
如:
ret = strtok(arr, sep);
printf(“%s\n”, ret);
ret = strtok(NULL, sep);//这里传空值是因为strtok记录了标记点位置的指针

返回值char*

2.函数实现

int main()
{
	char arr[] = "cwzhff@yeah.net";
	const char* sep = "@.";
	char arr2[30] = { 0 };
	strcpy(arr2, arr);
	char* ret = NULL;
	ret = strtok(arr, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);
}

这样比较冗余,我们可以改进下代码

int main()
{
	char arr[] = "cwzhff@yeah.net";
	const char* sep = "@.";
	char arr2[30] = { 0 };
	strcpy(arr2, arr);
	char* ret=NULL;
  for(ret=strtok(arr,sep);ret!=NULL;ret=strtpk(NULL,sep))
  {
  printf("%s",ret);
  }
  return 0;
}

五、strerror

1、函数理解

在这里插入图片描述
在这里插入图片描述
每个码都有对应的错误信息

2.函数实现
在这里插入图片描述

总结

1:函数strcat与strncat、strcpy与strncpy、strcmp与strncmp的区别

在这里插入图片描述
在这里插入图片描述
这俩种尽量用第二种比较安全(也称相对安全函数
字符函数与字符串函数对于以后的代码实现具有很大的帮助,因此深刻理解字符函数与字符串函数是有必要的!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL注入less-1

一、启动SQL注入的靶场 1、启动phpstudy 注&#xff1a;phpstudy默认的php版本为7.x&#xff0c;想要成功的搭建靶场&#xff0c;需要把php版本改为5.x 2、输入127地址加文件名 进入此界面后点击setup就行 3、进入less-1的关卡 靶场搭建成功 二、查看less-1的代码 注&#…

什么?300TB SSD要来了?

SK海力士在韩国首尔的一场新闻发布会上宣布&#xff0c;其正在研发一款前所未有的300TB容量的固态硬盘&#xff08;SSD&#xff09;。这款硬盘的预告是该公司一系列旨在推动数据中心和设备端AI能力发展的产品与技术组合的一部分。SK海力士引用市场研究预测&#xff0c;全球在AI…

每日一题(力扣740):删除并获得点数--dp+思维

其实跟打家劫舍没啥区别 排序去重之后去考虑当前位置和前两个位置之间的关系即可&#xff0c;具体见代码&#xff1a; class Solution { public:int deleteAndEarn(vector<int>& nums) {int n nums.size();if (n 1) return nums[0];unordered_map<int, int>…

代码随想录算法训练营DAY51|C++动态规划Part12|1143.最长公共子序列、1035.不相交的线、53.最大子序列和

文章目录 1143.最长公共子序列思路CPP代码 1035.不相交的线53.最大子序列和思路CPP代码 1143.最长公共子序列 力扣题目链接 文章讲解&#xff1a;1143.最长公共子序列 视频讲解&#xff1a;动态规划子序列问题经典题目 | LeetCode&#xff1a;1143.最长公共子序列 本题其实就跟…

GPU虚拟化和算力隔离探讨

1. 术语介绍 术语 全称 说明 GPU Graphics Processing Unit 显卡 CUDA Compute Unified Device Architecture 英伟达2006年推出的计算API VT/VT-x/VT-d Intel Virtualization Technology -x表示x86 CPU&#xff0c;-d表示Device SVM AMD Secure Virtual Machine …

ASP.NET视频点播系统的设计与实现

摘 要 本文阐述了基于WEB的交互式视频点播系统的协议原理、软件结构和设计实现。本视频点播系统根据流媒体传输原理&#xff0c;在校园局域网的基础上模拟基于Web的视频点播系统&#xff0c;实现用户信息管理、视频文件的添加、删除、修改及在线播放和搜索功能。本系统是一个…

6.块元素和行内元素

块元素 无论内容多少&#xff0c;该元素独占一行(p、 h1-h6…) 例子如下图 行内元素 内容撑开宽度&#xff0c;左右都是行内元素的可以排在一排(a、 strong、 em …) 例子如下 感谢您的观看&#xff0c;能和您一起学习是我最大的荣幸&#xff01; 文章学习资料&#xff1a;…

【快速入门Linux】10_Linux命令—Vi编辑器

文章目录 一、vi 简介1.1 vi1.2 vim1.3查询软连接命令&#xff08;知道&#xff09; 二、打开和新建文件&#xff08;重点&#xff09;2.1 打开文件并且定位行2.2 异常处理 三、vi三种工作模式&#xff08;重点&#xff09;3.1 末行模式-命令 四、常用命令4.0 命令线路图4.1 移…

url对象---了解url的结构

什么是url url是网页网页的地址&#xff0c;通过一个url我们可以访问到网页&#xff0c;同时url也可以用来引用文件(txt,json,jpg,js,css,html)&#xff0c;所以你可以理解成url是一个指示器&#xff0c;它可以指向一个文件&#xff0c;网页&#xff0c;图片&#xff0c;或者音…

《网络安全技术 网络安全众测服务要求》

近日&#xff0c;全国网络安全标准化技术委员会发布《网络安全技术 网络安全众测服务要求》&#xff08;GB/T 43741-2024&#xff0c;以下简称“众测服务要求”&#xff09;&#xff0c;并将在2024年11月1日正式实施。 《众测服务要求》确立了网络安全众测服务的角色及其职责&…

【skill】移动云服务器80端口

上个月玩CentOS7&#xff0c;提到alist端口问题&#xff0c;https://www.bilibili.com/read/cv33662501/ 云服务器不能被外网访问的原因 1 云服务器没放行端口 2 防火墙没放行端口 3 配置了端口转发 4 浏览器不支持搭建的网页 5 端口被其他软件占用 移动10086云服务的80端口…

ubuntu ros noetic 编译 ORB_SLAM2 过程记录

1. 连接 eigen库 sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen 2. opencvx 修改 CMakeList.txt 中的 find_package open cv版本 修改 include/orbExtracter.h 文件为&#xff1a; //#include <opencv2/opencv.hpp> #include<opencv2/imgproc/imgpro…

用魔法打败魔法:用360解除chrome浏览器的360主页

面临的问题&#xff1a; 试了108种方法都是不好使的。 后来看到&#xff1a; https://blog.csdn.net/qq_30267617/article/details/120373704 的介绍&#xff0c;发现可以呀。 三个步骤 步骤1 单击“功能大全” 步骤2 单击“主页防护” 步骤3 在这里更改。

数组不为人知的一面,sizeof与strlen的区分

数组有另外一种表达方式&#xff0c;接下来我用代码的形式展现出来&#xff1a; sizeof 是一个操作符。 是用来计算变量&#xff08;类型&#xff09;所占内存空间大小&#xff0c;不关注内存中存放的具体内容。 单位是字节。 strlen 是一个库函数&#xff0c;是专门求字符…

【计算机毕业设计】基于SpringBoot+Vue智能停车计费系统设计与实现

目录 一、项目介绍 二、项目主要技术 三、系统功能结构设计 四、系统详细功能的实现 4.1 前台功能实现 4.2 管理员模块实现 4.3 用户后台模块实现 五、实现代码 一、项目介绍 该系统采用了java技术、SpringBoot 框架&#xff0c;连接MySQL数据库&#xff0c;具有较高…

深度学习之基于Vgg16卷积神经网络印度交警手势识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着智能交通系统的不断发展&#xff0c;手势识别技术在其中扮演着越来越重要的角色。特别是在印度等…

【研发日记】Matlab/Simulink避坑指南(十一)——Delay周期Bug

文章目录 前言 背景介绍 问题描述 分析排查 解决方案 总结归纳 前言 见《研发日记&#xff0c;Matlab/Simulink避坑指南(六)——字节分割Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指南(七)——数据溢出钳位Bug》 见《研发日记&#xff0c;Matlab/Simulink避坑指…

Redis高并发可用-主从复制,集群

Redis高并发可用 1 复制 默认情况下&#xff0c;Redis都是主节点。每个从节点只能有一个主节点&#xff0c;而主节点可以同时具有多个从节点。复制的数据流是单向的&#xff0c;只能由主节点复制到从节点。 1.1 复制的拓扑结构 一主一从&#xff1a; 主一从结构是最简单的…

web3风格的网页怎么设计?分享几个,找找感觉。

web3风格的网站是指基于区块链技术和去中心化理念的网站设计风格。这种设计风格强调开放性、透明性和用户自治&#xff0c;体现了Web3的核心价值观。 以下是一些常见的Web3风格网站设计元素&#xff1a; 去中心化标志&#xff1a;在网站的设计中使用去中心化的标志&#xff0…

js[黑马笔记]

js基础 基础语法 输入输出 变量 数组 常量 数据类型 类型转换 运算符 语句 数组 函数 调用方式 函数名() 匿名函数 使用: 1.函数表达式 2.立即执行函数 对象 内置对象 web API DOM document object Model元素操作 获取元素 设置元素 定时器 DOM事件基础 事件监听 事件类…