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

news2025/1/12 20:38:27

遇见她如春水映莲花

字符函数与字符串函数(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的区别

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

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

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

相关文章

手写一个uart协议——rs232

先了解一下关于uart和rs232的基础知识 文章目录 一、RS232的回环测试1.1模块整体架构1.2 rx模块设计1.2.1 波形设计1.2.2代码实现与tb1.2.4 仿真 1.3 tx模块设计1.3.1 波形设计1.3.2 代码实现与tb1.3.4 顶层设计1.3.3 仿真 本篇内容&#xff1a; 一、RS232的回环测试 上位机…

改变视觉创造力:图像合成中基于样式的生成架构的影响和创新

原文地址&#xff1a;revolutionizing-visual-creativity-the-impact-and-innovations-of-style-based-generative 2024 年 4 月 30 日 介绍 基于风格的生成架构已经开辟了一个利基市场&#xff0c;它将机器学习的技术严谨性与类人创造力的微妙表现力融为一体。这一发展的核…

4.3 JavaScript变量

4.3.1 变量的声明 JavaScript是一种弱类型的脚本语言&#xff0c;无论是数字、文本还是其他内容&#xff0c;统一使用关键词var加上变量名称进行声明&#xff0c;其中关键词var来源于英文单词variable&#xff08;变量&#xff09;的前三个字母。 可以在声明变量的同时对其指定…

汇川AM400PLC通过EtherCAT总线控制禾川X3E伺服使能和点动控制

进行通信之前需要安装禾川X3E的XML文件&#xff0c;具体方法如下&#xff1a; 1、汇川AM400PLC和X3E通信配置 汇川AM400PLC和禾川X3E伺服EtherCAT通信-CSDN博客文章浏览阅读29次。1、汇川H5UPLC和X3E伺服EtherCAT总线控制汇川H5U PLC通过EtherCAT总线控制SV660N和X3E伺服_伺服…

转速和频率转换功能块(CODESYS ST源代码)

1、转速/频率常用转换关系 转速/频率/线速度/角速度计算FC_200 plc计算角速度-CSDN博客文章浏览阅读3.2k次。里工业控制张力控制无处不在,也衍生出很多张力控制专用控制器,磁粉制动器等,本篇博客主要讨论PLC的张力控制相关应用和算法,关于绕线机的绕线算法,大家可以参看专…

并行魔法:揭秘scikit-learn中的Bagging并行训练技术

并行魔法&#xff1a;揭秘scikit-learn中的Bagging并行训练技术 随着大数据时代的到来&#xff0c;机器学习模型的训练时间越来越长&#xff0c;尤其是在处理大规模数据集时。如何高效地训练模型成为了一个亟待解决的问题。幸运的是&#xff0c;scikit-learn库为我们提供了一种…

如何访问远程MySQL数据库?

访问远程MySQL数据库是在进行数据库开发和运维工作中经常遇到的需求。本文将介绍如何使用合适的工具和方法进行远程访问MySQL数据库。 什么是天联组网 天联组网是一款异地组网内网穿透产品&#xff0c;由北京金万维科技有限公司自主研发。天联能够在任何网络环境下实现不同地区…

Vitis HLS 学习笔记--HLS眼中的完美循环嵌套

目录 1. 简介 2. 示例 2.1 不完美循环 2.2 完美循环 2.3 HLS 眼中的循环 3. 总结 1. 简介 在处理嵌套循环时&#xff08;HDL或HLS工具中&#xff09;&#xff0c;优化循环结构对于实现最佳性能至关重要。嵌套循环的性能优化直接影响着计算的时延和资源利用率。创建完美嵌…

Redis 实战2

系列文章目录 本文将从字典的实现、哈希算法、解决键冲突、rehash、渐进式rehash几方面来阐述 Redis 实战Ⅱ 系列文章目录字典的实现哈希算法解决键冲突rehash渐进式 rehash渐进式 rehash 执行期间的哈希表操作 字典 API总结 字典的实现 Redis 的字典使用哈希表作为底层实现&…

什么是数据工程?

目录 一、什么是数据工程&#xff1f; 二、数据工程在医疗行业中的应用 三、数据工程在精准医疗方面的应用有哪些&#xff1f; 一、什么是数据工程&#xff1f; 数据工程是一个综合性的技术学科&#xff0c;涵盖了从数据的收集、存储、处理、分析到应用的整个数据处理过程。…

深入了解 Arthas:Java 应用程序诊断利器

序言 在 Java 应用程序的开发和运维过程中&#xff0c;诊断和解决性能问题是一项非常重要的任务。而 Arthas 作为一款由阿里巴巴开发的 Java 应用程序诊断工具&#xff0c;提供了一系列强大的功能&#xff0c;帮助开发人员实时监控、诊断和调优Java 应用程序。本文将深入介绍 …

光伏光热一体化技术PVT

1、PVT集热器简介 太阳能光伏光热一体化组件主要由光伏与光热两个部分组成。光伏部分采用技术成熟的太阳能光伏面板&#xff0c;通过控制系统为建筑提供所需电能&#xff0c;主要包括光伏电池、蓄电池、逆变器和控制器等构件。光热部分主要为集热器&#xff0c;将太阳能转换为热…

禅道项目管理系统 身份验证漏洞分析QVD-2024-15263

前言 最近不怎么更新了&#xff01;向小伙伴说明下 我不是什么组织 更不什么经销号&#xff08;尽管csdn有很多经销广告号&#xff09; 一确实是下岗了&#xff01;忙着为找工作而发愁。简历都投出去如同石沉大海能不愁吗!.哎...... 二是忙着论文及材料的事...…

领域驱动设计(DDD)笔记(一)基本概念

文章链接 领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;一&#xff09;基本概念-CSDN博客领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;二&#xff09;代码组织原则-CSDN博客领域驱动设计&#xff08;DDD&#xff09;笔记&#xff08;三&#xff09;后…

嵌入式开发四:STM32 基础知识入门

为方便更好的学习STM32单片机&#xff0c;本篇博客主要总结STM32的入门基础知识&#xff0c;重点在于理解寄存器以及存储器映射和寄存器映射&#xff0c;深刻体会STM32是如何组织和管理庞大的寄存器&#xff0c;从而提高开发效率的&#xff0c;为后面的基于标准库的开发做好铺垫…

Elasticsearch:对 Java 对象的 ES|QL 查询

作者&#xff1a;Laura Trotta ES|QL 是 Elasticsearch 引入的一种新的查询语言&#xff0c;它将简化的语法与管道操作符结合起来&#xff0c;使用户能够直观地推断和操作数据。官方 Java 客户端的新版本 8.13.0 引入了对 ES|QL 查询的支持&#xff0c;提供了一个新的 API&…

手撸Mybatis(四)——连接数据库进行简单查询

本专栏的源码&#xff1a;https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 添加数据库操作模板 对于JDBC操作&#xff0c;一般包括以下几个步骤&#xff1a; 1&#xff09;注册驱动 2&#xff09;建立连接 3&#xff09;执行sql语句 4&#xff09;处理结果 5&#xff09…

【neteq】tgcall的调用、neteq的创建及接收侧统计

G:\CDN\P2P-DEV\Libraries\tg_owt\src\call\call.cc基本是按照原生webrtc的来的:G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.cpptg对neteq的使用 worker 线程创建call Call的config需要neteqfactory Call::CreateAu…

Boosting算法揭秘:从原理到scikit-learn实战

Boosting算法揭秘&#xff1a;从原理到scikit-learn实战 在机器学习的江湖中&#xff0c;Boosting算法以其强大的预测能力和独特的训练方式占据了一席之地。与Bagging算法并行训练的理念不同&#xff0c;Boosting算法更注重模型的串行迭代和错误修正。本文将从Boosting算法的基…

JVM笔记1--Java内存区域

1、运行时数据区域 从上图可以看出来&#xff0c;Java虚拟机运行时数据区域整体上可以分成5大块&#xff1a; 1.1、程序计数器 程序计数器是一块较小的内存空间。它可以看做当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里&#xff0c;字节码解释器工作时就是…