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

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.xdnf.cn/news/1550651.html

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

相关文章

《向量数据库指南》——非结构化数据迁徙战:向量数据库的挑战与突破

在深入探讨非结构化数据在向量数据库间迁移所面临的挑战时,我们不得不正视这一领域所独有的复杂性与特殊性。随着人工智能、大数据技术的迅猛发展,向量数据库作为处理高维、非结构化数据的核心工具,其重要性日益凸显。然而,与成熟的关系型数据库迁移相比,向量数据库之间的…

扫盲接口测试,有些知识是需要了解和掌握的(建议收藏)

扫盲内容&#xff1a; 1.什么是接口&#xff1f; 2.接口都有哪些类型&#xff1f; 3.接口的本质是什么&#xff1f; 4.什么是接口测试&#xff1f; 5.问什么要做接口测试&#xff1f; 6.怎样做接口测试&#xff1f; 7.接口测测试点是什么&#xff1f; 8.接口测试都要掌…

02-指针代码示例

视频地址&#xff1a; 数组作为函数参数_哔哩哔哩_bilibili 指针是一个变量,用来存放其他变量的地址. 一、语法角度说: 需要用整形变量的指针,去存储一个整形变量的地址. 二、代码部分: (一) 1.指针赋值 int main(int argc, const char* argv[]) {int a;int* p;//这里要…

王道-操作系统

3 下列说法正确的是_____ 答案:A 解析: A 正确。如链接文件可以顺序存取,但不能随机存取。连续文件可随机存取,也可顺序存取。 B 错误。一个 FCB 就是一个文件目录项。在引入索引节点后,每个文件的目录项只保留文件名和指向该文件对应的索引节点指针,而索引节点的有关信息…

AD导出gerber文件(光绘文件)

第一步&#xff1a; 英寸 2:5 勾选你想显示的层 默认默认 第二步&#xff1a; 第三步&#xff1a; 默认

每日OJ_牛客_NC95数组中的最长连续子序列_排序+模拟_C++_Java

目录 牛客_NC95数组中的最长连续子序列_排序和模拟 题目解析 C代码 Java代码 牛客_NC95数组中的最长连续子序列_排序模拟 数组中的最长连续子序列_牛客题霸_牛客网 题目解析 排序 模拟。但是要注意处理数字相同的情况&#xff0c;还要注意去重。 排序后使用一个变量cou…

【预备理论知识——1】深度学习:概率论概述

简单地说&#xff0c;机器学习就是做出预测。 概率论 掷骰子 假设我们掷骰子&#xff0c;想知道看到1的几率有多大&#xff0c;而不是看到另一个数字。 如果骰子是公平的&#xff0c;那么所有六个结果{1,…, 6}都有相同的可能发生&#xff0c; 因此我们可以说 1 发生的概率为1…

软件设计(实验三):经典软件体系结构风格(二)

实验目的&#xff1a; 本实验旨在帮助学生理解和实现两种常见的软件体系结构风格&#xff1a;事件的隐式调用软件体系结构、层次软件体系结构。通过编写具体的代码&#xff0c;学生将能够掌握这两种风格的基本原理&#xff0c;并能够评估它们在不同场景下的适用性和优劣。 基…

string类的使用(上)

目录 1.string类的概念 2.string的构造函数&#xff08;实现初始化&#xff09; 3.对string类容量获取和操作 4.string类对象的访问和遍历 4.1operator[] 4.2begin和end 4.3 rbegin 和 rend 4.4迭代器分类 4.5范围for&#xff08;自动实现遍历&#xff09; 5.string类…

http请求过程 part-2

http请求过程 http应用层 实体 实体分为实体首部和实体主体&#xff0c;实体首部是用来描述主体的 实体部分是可选的&#xff0c;它被用来运送请求或者响应的数据 传输层-TCP HTTP连接是建立在TCP连接的基础上 以流形式通过一条已经打开的TCP连接&#xff0c;按顺序进行…

next 从入门到精通

next 从入门到精通 相关链接 演示地址 演示地址 源码地址 源码地址 获取更多 获取更多 hello 大家好&#xff0c;我是 数擎科技&#xff0c;今天来跟大家聊聊 Next.js 如果你遇到任何问题&#xff0c;欢迎联系我 m-xiaozhicloud 什么是 Next.js Next.js 是一个基于 Reac…

27 C 语言标准库 <stdio.h> 中的两个字符串函数:sprintf、sscanf,不同编码方式的中文字符长度

目录 1 sprintf 1.1 函数原型 1.2 功能说明 1.3 案例演示 1.4 注意事项 2 sscanf 2.1 函数原型 2.2 功能说明 2.3 案例演示 2.4 使用 %s 解析字符串的易错点 2.4.1 空白符问题 2.4.2 顺序问题 2.4.3 中文字符长度问题 2.5 注意事项 1 sprintf 1.1 函数原型 spri…

求恰好为k 的区间数量(滑动窗口进阶版)

前言&#xff1a;之前做的滑动窗口都是可以直接一遍过&#xff0c;然后每次右边确定了以后&#xff0c;左边不断缩小寻找最优解 但是这个题目呢我们不仅要保证我们的辅音字母的个数恰好为k&#xff0c;其他元音字母的个数只要每个都出现了就行&#xff0c;这个就导致我们不能用…

【IEEE PDF eXpress】格式不对

目录 一、问题二、解决方法 一、问题 word的文档&#xff0c;用IEEE PDF eXpress网站生成pdf后&#xff0c;提交论文出现错误&#xff1a; Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…

Java_TestNg

TestNg 前言支持特性 使用步骤1.引入库 常用注解Test注解BeforeSuite AfterSuiteAfterClass BeforeClassAfterTest BeforeTestAfterGroups BeforeGroupsBeforeMethod AfterMethodDataProviderFactoryListenersPatameters断言相等 不相等true/falsenull / !nullequals / !equals…

Leetcode 887. 鸡蛋掉落

1.题目基本信息 1.1.题目描述 给你 k 枚相同的鸡蛋&#xff0c;并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。 已知存在楼层 f &#xff0c;满足 0 < f < n &#xff0c;任何从 高于 f 的楼层落下的鸡蛋都会碎&#xff0c;从 f 楼层或比它低的楼层落下的鸡蛋都…

AIGC时代,大模型微调如何发挥最大作用?

人工智能的快速发展推动了大模型的广泛应用&#xff0c;它们在语言、视觉、语音等领域的应用效果已经越来越好。但是&#xff0c;训练一个大模型需要巨大的计算资源和时间&#xff0c;为了减少这种资源的浪费&#xff0c;微调已经成为一种流行的技术。微调是指在预训练模型的基…

DVWA | File Inclusion(文件包含)渗透测试

概念&#xff1a; 漏洞产生原因&#xff1a; 主要是由于开发人员没有对用户输入的文件路径进行严格的过滤和验证。例如&#xff0c;如果一个 Web 应用程序接受用户输入的文件路径&#xff0c;然后使用这个路径进行文件包含&#xff0c;而没有对用户输入进行任何检查&#xff0c…

【笔记】数据结构12

文章目录 2013年408应用题41方法一方法二 看到的社区的一个知识总结&#xff0c;这里记录一下。 知识点汇总 2013年408应用题41 解决方法&#xff1a; 方法一 &#xff08;1&#xff09;算法思想 算法的策略是从前向后扫描数组元素&#xff0c;标记出一个可能成为主元素的元…

【YOLO目标检测二维码数据集】共3112张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;3112 标注数量(txt文件个数)&#xff1a;3112 标注类别数&#xff1a;1 标注类别名称&#xff1a;qrcode 数据集下载&#xff1a;二维码数据集 图片示例 数据集图片&#xff1a; 数据集…