常见字符函数和字符串函数(下)

news2024/9/29 18:36:24

1. strncpy 函数的使用

  • 的前 number 个字符复制到目标。如果在复制 num 个字符之前找到 C 字符串的末尾(由 null 字符表示),则目标将填充零,直到写入总数 num 个字符为止。
  • 如果 source 长于 num,则不会在 destination 的末尾隐式附加 null 字符。因此,在这种情况下, destination 不应被视为以 null 结尾的 C 字符串(因此读取它会溢出)。
  • destination 和 source 不应重叠 
  • 目标空间必须可修改并且足够大,否则会引起报错。

示例:

1.  #include<stdio.h>
2.  #include<string.h>
3.  int main()
4.  {
5.  	char str1[] = "Hello ";
6.  	char str2[20] = { 1,2,3,4,5,6,7,8,9,10 };
7.  	strncpy(str2, str1, 7);
8.  	printf("%s\n", str2);
9.  	return 0;
10. }

如图,调试后发现当num大于原空间字符串长度后,会在其后追加0,直到长度等于num。

2. strncat函数的使用

 

  • 将 source 的前 num 个字符附加到 destination,外加一个终止 null 字符。
  • 如果 source 中 C 字符串的长度小于 num,则仅复制终止 null 字符之前的内容。 
  • 目标空间必须可修改并且足够大,否则会引起报错。

示例:

1.  #include<stdio.h>
2.  #include<string.h>
3.  int main()
4.  {
5.  	char str1[20];
6.  	char str2[20];
7.  	strcpy(str1, "To be ");
8.  	strcpy(str2, "or not to be");
9.  	strncat(str1, str2, 6);
10. 	printf("%s\n", str1);
11. 	return 0;
12. }

3. strncmp函数的使用 

  • 比较 C 字符串 str1 的字符数与 C 字符串 str2 的字符数。
  • 此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续处理以下对,直到字符不同,直到到达终止 null 字符,或者直到两个字符串中的 num 个字符匹配,以先发生者为准。

 示例:

1.  #include<stdio.h>
2.  #include<string.h>
3.  int main()
4.  {
5.  	char str1[20] = "abcdef";
6.  	char str2[20] = "abcdeg";
7.  	int ret = strncmp(str1, str2, 4);
8.  	int sag = strcmp(str1, str2);
9.  	printf("%d\n", ret);
10. 	printf("%d\n", sag);
11. 	return 0;
12. }

图中strncmp函数规定了仅仅只比较前四个字符,所以他是相等的,返回值为0;而strcmp函数则是全部比较,两个字符串中的字符串逐个进行比较,所以返回值为小于0的数。

4. strstr的使用和模拟实现 

  • 返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回 null 指针。
  • 匹配过程不包括终止 null 字符,但会在此处停止。

示例:

1.  #include<stdio.h>
2.  #include<string.h>
3.  int main()
4.  {
5.  	char str[] = "My name is LiMing ! And you?";
6.  	char *s=strstr(str, "LiMing");
7.  	printf("%s\n", s);
8.  	return 0;
9.  }

由示例代码和图像可知:其返回的是出现目标字符的地址。

strstr函数的模拟实现 :

1.  char* strstr(const char* str1, const char* str2)
2.  {
3.  	char* cp = (char*)str1;
4.  	char* s1, * s2;
5.  	if (!*str2)
6.  	{
7.  		return ((char*)str1);
8.  	}
9.  	while (*cp)
10. 	{
11. 		s1 = cp;
12. 		s2 = (char*)str2;
13. 		while (*s1 && *s2 && !(*s1 - *s2))
14. 		{
15. 			s1++, s2++;
16. 		}
17. 		if (!*s2)
18. 		{
19. 			return (cp);
20. 		}
21. 		cp++;
22. 	}
23.     return NULL;
24. }

由代码可知:我们设定的规则是如果我们给定的字符串为空,即查找字符串为空,直接返回源字符串的地址;while循环进入的条件设定的是两个字符串军不为空并且起始字符相等,然后开始遍历,出循环后,如果查找字符串为空,则说明找到了,若不为空,则说明查找到到的部分和要查找的字符串虽然有重叠之处,但并不完全重合,也就证明不是,再继续进行查找。

5. strtok函数的使用

  • 对此函数的一系列调用将 str 拆分为标记,这些标记是由分隔符中的任何字符分隔的连续字符序列。
  • 在第一次调用时,该函数需要一个 C 字符串作为 str 的参数,其第一个字符用作扫描标记的起始位置。在后续调用中,该函数需要一个 null 指针,并使用最后一个标记结束后的位置作为扫描的新起始位置。
  • 为了确定令牌的开头和结尾,该函数首先从起始位置扫描分隔符中未包含的第一个字符(该字符将成为令牌的开头)。然后从令牌的开头开始扫描分隔符中包含的第一个字符,该字符将成为令牌的结尾。如果找到终止 null 字符,扫描也会停止。
  • 令牌的此结尾将自动替换为 null 字符,令牌的开头由函数返回。
  • 在对 strtok 的调用中找到 str 的终止 null 字符后,对此函数的所有后续调用(以 null 指针作为第一个参数)都将返回 null 指针。

 示例:

1.  #include<stdio.h>
2.  #include<string.h>
3.  int main()
4.  {
5.  	char arr[] = "192.168.6.111";
6.  	char* sep = ".";
7.  	char* str = NULL;
8.  	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
9.  	{
10. 		printf("%s\n", str);
11. 	}
12. 	return 0;
13. }

 6. strerror函数的使用

  • 解释 errnum 的值,生成一个字符串,其中包含一条消息,该消息描述错误条件。
  • strerror函数可以把参数部分对应错误码对应的错误信息的字符串地址返回来。
  • 在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明的,C语⾔程序启动的时候就会使⽤⼀个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会将对应的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

示例1:

1.  #include<stdio.h>
2.  #include<string.h>
3.  #include<errno.h>
4.  int main()
5.  {
6.  
7.  	for (int i = 0; i <= 10; i++)
8.  	{
9.  		printf("%s\n", strerror(i));
10. 	}
11. 	return 0;
12. }

打印结果如下: 

1.  No error
2.  Operation not permitted
3.  No such file or directory
4.  No such process
5.  Interrupted function call
6.  Input/output error
7.  No such device or address
8.  Arg list too long
9.  Exec format error
10. Bad file descriptor
11. No child processes

示例2:

1.  #include<stdio.h>
2.  #include<string.h>
3.  #include<errno.h>
4.  int main()
5.  {
6.  	FILE* pFile;
7.  	pFile = fopen("unexist.ent", "r");
8.  	if (pFile == NULL)
9.  	{
10.  		printf("Error qpening file unexist.ent: %s\n", strerror(errno));
11. 	}
12. 	return 0;
13. }

输出:

1.  Error qpening file unexist.ent: No such file or directory

也可以使用perror函数,perror函数相当于一次将上述代码中的第10行完成了,直接将错误信息打印出来。perror函数打印出来完参数部分的字符串后,再打印一个冒号和空格,再打印错误信息。

1.  #include<stdio.h>
2.  #include<string.h>
3.  #include<errno.h>
4.  int main()
5.  {
6.  	FILE* pFile;
7.  	pFile = fopen("unexist.ent", "r");
8.  	if (pFile == NULL)
9.  	{
10. 		perror("Error qpening file unexist.ent");
11. 	}
12. 	return 0;
13. }

输出:

1.  Error qpening file unexist.ent: No such file or directory

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

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

相关文章

目标检测 DETR(2020)

文章目录 前言backbone位置编码&#xff08;二维&#xff09;encoder、decoderprediction heads损失函数计算 前言 DETR全称是Detection Transformer&#xff0c;是首个基于Transformer的端到端目标检测网络&#xff0c;最大的特点就是不需要预定义的先验anchor&#xff0c;也…

项目没亮点?那就来学下pk功能设计吧

先赞后看&#xff0c;南哥助你Java进阶一大半 麻省理工学院开源的Redis adapter适配器&#xff0c;可以将事件广播到多个单独的 socket.io 服务器节点。这一点和下文精彩的内容相关。 我是南哥&#xff0c;一个Java学习与进阶的领路人。 相信对你通关面试、拿下Offer进入心心念…

湖州市自闭症寄宿学校:个性化教育培养孩子潜能

在湖州市&#xff0c;自闭症寄宿学校正积极探索个性化教育的道路&#xff0c;致力于为自闭症儿童提供最适合他们成长与发展的教育环境。这一理念不仅在当地得到了实践&#xff0c;更在全国范围内产生了深远的影响。今天&#xff0c;我们将目光投向广州&#xff0c;深入了解星贝…

头戴式蓝牙耳机哪个品牌比较好?西圣、声阔、QCY热款实测性能PK

头戴式蓝牙耳机凭借其卓越的音质表现、沉浸式的听音体验以及出色的降噪功能&#xff0c;成为了众多音乐爱好者和通勤人士的首选&#xff0c;随着技术的不断进步&#xff0c;西圣、声阔、QCY等知名品牌纷纷推出了各具魅力的头戴式蓝牙耳机产品&#xff0c;面对它们家的耳机&…

十进制与ip地址转换公式(EXCEL公式)

1、十进制转为ip地址公式 TEXT(INT(C2/16777216),“0”)&“.”&TEXT(INT((C2-INT(C2/16777216)*16777216)/65536),“0”)&“.”&TEXT(INT((C2-INT(C2/16777216)*16777216-INT((C2-INT(C2/16777216)*16777216)/65536)*65536)/256),“0”)&“.”&TEXT(MO…

城市空间设计对居民生活质量的影响:构建宜居城市的蓝图

在快节奏的现代生活中&#xff0c;城市不仅是经济活动的中心&#xff0c;更是人们生活、工作、休闲的综合载体。本文旨在深入探讨城市空间设计如何通过科学规划、人性化考量以及生态融合&#xff0c;为居民打造更加宜居、和谐的生活环境。 1. 促进社区互动与归属感 城市空间设…

揭秘FlashAttention:提升注意力计算的速度与内存效率

论文题目&#xff1a;FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 论文地址&#xff1a;https://arxiv.org/pdf/2205.14135 今天分享一篇论文《FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness》&#xff0c;…

The First项目报告:解读跨链互操作性平台Wormhole

在加密领域&#xff0c;随着公链种类越来越丰富&#xff0c;彼此之间的相对独立&#xff0c;犹如一座座孤悬海外的孤岛&#xff0c;不利于自身生态的发展&#xff0c;因此从资产跨链开始&#xff0c;越来越多的跨链技术被研发出来&#xff0c;多链成为当前区块链的主流概念&…

2024.9.26C++作业

1. 什么是虚函数&#xff0c;什么是纯虚函数&#xff1f; 1.虚函数在基类中声明&#xff0c;使用virtual关键字修饰成员函数&#xff0c;并且允许在派生类中重写。 2.在运行时&#xff0c;允许基类指针或者引用调用这个函数时&#xff0c;根据实际对象类型调用派生类&#xff…

安卓主板_MTK4G/5G音视频记录仪整机及方案定制

音视频记录仪方案&#xff0c;采用联发科MT6877平台八核2* A78 6* A55主频高达2.4GHz, 具有高能低耗特性&#xff0c;搭载Android 12.0智能操作系统&#xff0c;可选4GB32GB/6GB128GB内存&#xff0c;运行流畅。主板集成NFC、双摄像头、防抖以及多种无线数据连接&#xff0c;支…

YOLOv8改进,YOLOv8改进损失函数采用Powerful-IoU(2024年最新IOU),助力涨点

摘要 边界框回归(BBR)是目标检测中的核心任务之一,BBR损失函数显著影响其性能。然而,观察到现有基于IoU的损失函数存在不合理的惩罚因子,导致回归过程中锚框扩展,并显著减缓收敛速度。为了解决这个问题,深入分析了锚框扩展的原因。针对这个问题,提出了一种新的Powerfu…

【C++】类和对象<上>(类的定义,类域,实例化,this指针)

目录 一. 类的定义 【对比c】结构体和类的区别 1. 称呼&#xff1a;变量 or 对象&#xff1f; 2. 类型&#xff1a; 3. 访问限定&#xff1a; 4. c和c结构体使用 5. 相同点&#xff1a; 二. 类域 三. 实例化 1. 1对N 2. 计算大小只考虑成员变量 3. 到此一游 四. …

【深度学习】04-Cnn卷积神经网络-01- 卷积神经网络概述/卷积层/池化层/分类案例精讲

卷积神经网络&#xff08;CNN&#xff0c;Convolutional Neural Network&#xff09;是专门用于处理图像数据的神经网络。 图像的基本概念 图像其实是数组&#xff1a; ndarray -> [高&#xff0c;宽&#xff0c;3通道] --> uint8 每个值取值范围0-255&#xff0c;那么…

高空抛物AI检测算法:精准防控,技术革新守护城市安全

近年来&#xff0c;随着城市化进程的加速&#xff0c;高楼大厦如雨后春笋般涌现&#xff0c;但随之而来的高空抛物问题却成为城市管理的一大难题。高空抛物不仅严重威胁行人的安全&#xff0c;还可能引发法律纠纷和社会问题。为了有效预防和减少高空抛物事件的发生&#xff0c;…

pnpm依赖安装失败解决|pnpm项目从一个文件夹复制到另一个文件夹运行失败问题解决-以vbenAdmin项目为例

1 前言 最近在使用vben admin项目迁移时&#xff0c;从一个文件夹复制到另一个文件夹运行不起来&#xff0c;排查了一天&#xff0c;终于把问题排查出来了&#xff0c;特地记录一下&#xff0c;便于自己看也便于大家看。 使用项目安装包版本&#xff1a; v2.11.5 https://gi…

【产教融合】新媒体产业园携手高校,共育数字创意人才

在新媒体浪潮的推动下&#xff0c;数字创意产业正以前所未有的速度蓬勃发展。为了应对这一趋势&#xff0c;新媒体产业园积极响应“产教融合”的号召&#xff0c;携手国内多所顶尖高校&#xff0c;共同开启数字创意人才培养的新篇章。 树莓集团一直以来都在新媒体领域有着卓越的…

uni-app如果自定义tabbar实现底部样式有凸起效果,背景带圆角

想要实现的效果、 大部分可以参考这一篇文章 小程序弹出框是没办法遮挡住底部的tabbar的&#xff0c;解决的办法是使用自定义tabbar。。uni-app小程序如何自定义tabbar-CSDN博客 我们只要改下index.wxml和index. wxs的代码就行了 <view class"tab-bar"><b…

stm32 bootloader跳转程序设计

文章目录 1、bootloader跳转程序设计&#xff08;1&#xff09;跳转程序&#xff08;2&#xff09;、app程序中需要注意<1>、在keil中ROM起始地址和分配的空间大小<2>、在system_stm32f4xx.c中设置VECT_TAB_OFFSET为需要偏移的地址<3>、main函数中使能中断 总…

浅析 Keil 中的 sct 文件

目录 一、程序的存储与运行1、存储2、加载、运行 二、sct 分散加载文件1、简介2、文件格式2.1 加载域2.2 执行域2.3 输入节区描述 3、配置 sct 文件 一、程序的存储与运行 1、存储 程序编译后&#xff0c;应用程序中所有具有同一性质的数据(包括代码)被归到一个域&#xff0c…

Java必修课——Spring框架

目录 一、Spring框架概述二、IOC概念和原理2.1、什么是IOC2.2、IOC接口 三、深入理解Java基础中的集合框架3.1、Collection3.2、Map3.3、集合工具类 四、练习写一个SpringMVC框架1、介绍2、程序实践3、总结 五、Java开发者必备10大数据工具和框架 一、Spring框架概述 Spring是…