字符串函数(2)<C语言>

news2024/9/23 9:27:41

前言

        快一周没更博客了,最近有点忙,今天闲下来了,还是不行,继续干,书接上回继续介绍字符串函数:strncpy()、strncat()、strcmp()、strtok()使用、strstr()使用以及模拟实现、strerror()使用。


strncpy()、strncat()、strncmp()

        这几个函数看着很眼熟,用法确实和前文的函数类似,不同的是多出了一个n,也有一些不同。

strncpy()

        函数参数及其返回类型:

char* strncpy(char* destination , const char* source , size_t num);
//返回值是目的字符串的起始地址

作用:

从源字符串中拷贝num个字符串到目的字符串中。

注意点:

①如果num大于源字符长度,在拷贝完源字符串后,在目标字符串中追加\0,直到num个。

②如果num小于源字符长度,在拷贝完指定字符串后,不会在目标字符串中追加\0

使用举例:

 strncat()

        函数参数及其返回类型:

char* strncat(char* destination , const char* source , size_t num);
//返回值是目的字符串的起始地址

作用:

从源字符串中追加前num个字符串到目的字符串中,再追加个\0。

注意点:

①如果num大于源字符长度,只会将源字符串中到\0的字符串追加到目的字符串末尾。

②相较于strcat()函数,strncat()可实现自追加(先用strlen()函数求出字符串长度,再追加),原因也很简单,strncat()每次追加完毕会自动追加一个\0。

使用举例:

  strncmp()

        函数参数及其返回类型:

int strncat(const char* str1, const char* str2 , size_t num);
//返回值是大于:大于0的数、等于:0、小于:小于0的数

作用:

比较str1与str2前num个字符

注意点:

使用举例:


 strtok()使用

        函数参数及其返回类型:

char* strtok(char* str, const char* sep );
//返回值是指向找到以sep中的字符分隔的字符串的首地址,如果没找到返回NULL

作用:

找到第一次以sep字符串中的字符分隔的字符串的首地址

注意点:

①sep参数中定义了分隔字符串的集合,也就是说可以为多个分隔字符且可以无序

②当找到第一个以sep中字符分隔的字符串时,将分隔字符以\0替代(strtok()函数会改变源字符,所以一般会使用一个临时变量来接收,不改变源字符)

③strtok()函数具有记忆性(含有static关键字),所以当多次调用strtok()函数时,可将多个字段打印出来

④如果找不到以sep字符串中的字符分隔的字符串,就返回NULL

⑤strtok()函数第一个参数为NULL时,函数将在同一个字符保存的位置找下一个字段

使用举例:

//strtok()函数举例
#include<string.h>
int main() {
	char str[20] = "192.91.89.7";//以“.”分隔的字符串
	char* sep = ".";//分隔字符(可以为多个)
	char* ret = NULL;
	for (ret = strtok(str, sep); ret != NULL;ret=strtok(NULL,sep))
	//初始化表达式只执行一次,取出第一个字段:ret = strtok(str, sep)
	//条件表达式用于判断是否为NULL,为NULL则找不到了:ret != NULL
	//更新表达式用于查找下一个字段,第一个参数为NULL时,会从上一次分隔位置查找:ret=strtok(NULL,sep)
		printf("%s\n", ret);
	return 0;
}

运行结果:


 strstr()使用以及模拟实现

      函数参数及其返回类型:

char* strstr(const char* str1, const char* str2 );
//返回值是在str1中第一次出现str2字符串的首地址,如果没找到返回NULL

作用:

在str1中找str2字符串首次出现的位置

使用举例:

 模拟实现:

#include<assert.h>
char* my_strstr(const char* str1, const char* str2) {
	assert(str1 && str2);
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = str1;//cur直接指向str1
	while (*cur) {
		s1 = cur;//s1指向cur
		s2 = str2;//s2变量用来指向str2
		while (*s1 && *s2 && *s1 == *s2) {
		//当s1和s2不为\0时继续找:*s1 && *s2 
		//满足条件找下一对字符:*s1 == *s2
			s1++;
			s2++;
		}
		if (!*s2) {//取反操作判断是否为\0,为\0说明s2对应到最后一个字符,跳出循环了
			return cur;
		}
		cur++;
		//cur自增,当一次不满足时,使指向cur的s1跳到下一个字符继续匹配
	}
	return NULL;
	//指向str1的cur自增到str1的最后一个字符,还没匹配成功,说明找不到了,返回NULL
}
//strstr()函数模拟实现
int main() {
	char str2[100] = "ABC";
	char str1[100] = "HJKANUABCENNS";
	char* str;
	str = my_strstr(str1, str2);
	printf("%s", str);
	return 0;
}

运行结果:


 strerror()

       函数参数及其返回类型:

char* strerror(int errornum);
//返回值是整型数字errornum对应的错误码信息首地址

作用:

strerror()函数可以把参数部分对应的错误码返回

注意点:

简单来说,在C语言编译器上规定了一些错误码(如栈溢出:strack overflew),一般存放在error.h头文件中,当C语言程序启动时,会使用全局变量errno来记录当前错误码的地址。

errno是一个全局变量用来存放错误码。

使用举例:

#include<string.h>
int main() {
	int i;
	for (i = 0; i < 10; i++) {
		printf("%s\n", strerror(i));
		//打印前10条错误码,其中错误码0为无错
	}
	return 0;
}

运行结果:

 值得注意的是使用perror()函数可以直接将当前错误码打印出来(括号内为提示信息,可不传参)

 

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

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

相关文章

几种流行的并行方法了解

几种流行的并行方法&#xff1a; 数据并行&#xff08;data parallel&#xff09;模型并行&#xff08;model parallel&#xff09; tensor并行pipeline并行sequence并行Zero Redundancy Data Parallelism&#xff08;ZeRO&#xff09; Data parallelism (DP) 经典的数据并行…

snmp学习小结

背景 很多厂商网络设备获取网络信息接口不一样&#xff0c;snmp用来统一接口 官网Net-SNMP 模型 每个主机可以安装自己的snmp agent&#xff0c;它可以监控目标机器的网络流量&#xff0c;当外部查询snmp信息时&#xff0c;请求会发到目标机器的snmp agent&#xff0c;由sn…

魅族应用市场驳回 安装包包含32位库,请处理32位库后再重新提交

问题出现 解决方法 打开HBuilerX找到项目的mainfest.json 取消cpu类型中armeabi-v7a的勾选。 armeabi-v7a 第7代及以上的ARM处理器&#xff08;ARM32位&#xff09;&#xff0c;市面上大多数手机使用此CPU类型。 arm64-v8a 第8代、64位ARM处理器&#xff08;ARM64位&#x…

Halcon 光度立体 缺陷检测

一、概述 halcon——缺陷检测常用方法总结&#xff08;光度立体&#xff09; - 唯有自己强大 - 博客园 (cnblogs.com) 上周去了康耐视的新品发布会&#xff0c;我真的感觉压力山大&#xff0c;因为VM可以实现现在项目中的80% 的功能&#xff0c;感觉自己的不久就要失业了。同时…

Java通过Html(ftl模板)生成PDF实战, 可支持商用

Java通过Html(freemarker模板)生成PDF实战, 可支持商用 技术架构 springboot freemarker [pdfbox] flying-saucer-pdf 生成流程&#xff1a; freemarker: 根据数据填充ftl模板文件&#xff0c;得到包含有效数据的html文件&#xff08;包含页眉页脚页码的处理&#xff0c…

Delft3D水动力-富营养化模型(水质模型)教程

原文链接&#xff1a;Delft3D水动力-富营养化模型&#xff08;水质模型&#xff09;教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247605459&idx5&sn105e94f09f0589172835ce8204519971&chksmfa821d34cdf59422b4f6c39b243373a23836d79841a1fcd19f9…

超越中心化:Web3的去中心化应用探索

随着区块链技术的迅速发展&#xff0c;Web3作为其最前沿的应用之一&#xff0c;正引领着互联网进入了一个新的时代。Web3不仅仅是技术的进步&#xff0c;更是一种全新的思维方式和社会模式&#xff0c;其核心理念是去中心化、自治和透明&#xff0c;这与传统的中心化互联网模式…

关于栈的简单讲解

哈喽&#xff0c;小伙伴们大家好呀&#xff0c;今天给大家带来栈、队列的那些知识点。 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。 总结 一种线性…

springboot+minio 文件上传

前期准备 需要先安装minio文件服务器&#xff0c;请参考我上一篇文章 pom.xml 版本 本次使用的是springboot2.7.16 版本&#xff0c; minio 版本是8.2.2 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-pare…

1071.字符串的最大公因子

对于字符串s和t&#xff0c;只有在s t t t ... t t&#xff08;t自身连接1次或多次&#xff09;时&#xff0c;我们才认定 “t能除尽s”。 给定两个字符串str1和str2。返回最长字符串x&#xff0c;要求满足x能除尽str1且x能除尽str2 。 示例 1&#xff1a; 输入&#xf…

上位机图像处理和嵌入式模块部署(f103 mcu原理图)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 从linux卡片电脑转到mcu领域,第一个需要适应的估计就是原理图。之前学习linux的时候,我们大概只需要知道一些接口就好了,比如电源键、usb、网口、hdmi口、音频口、tf卡槽等等,整…

使用Java 读取PDF表格数据并保存到TXT或Excel

目录 导入相关Java库 Java读取PDF表格数据并保存到TXT Java读取PDF表格数据并保存到Excel 在日常工作中&#xff0c;我们经常需要处理来自各种来源的数据。其中&#xff0c;PDF 文件是常见的数据来源之一。这类文件通常包含丰富的信息&#xff0c;其中可能包含重要的表格数据…

冯喜运:5.27黄金暴跌大阴后出现“暂定符”今日黄金原油操作策略

【黄金消息面分析】&#xff1a;金价虽然有大阴线暴跌&#xff0c;但依然属于超买后的调整而非熊市&#xff0c;对中长线投资者来说只是市场洗牌。因此&#xff0c;在出现企稳迹象之后&#xff0c;随时关注反弹时机的启动。未来几日&#xff0c;黄金空头可能在进一步发力之前需…

pdf拆分成多个文件 pdf拆分成一页一页

pdf拆分成多个文件的方法。在现代办公环境中&#xff0c;PDF文件因其跨平台、保持格式一致等特性&#xff0c;成为了广泛使用的文件格式。然而&#xff0c;有时我们需要对PDF文件进行拆分&#xff0c;以便更好地管理和使用其中的内容。本文将详细介绍PDF拆分的方法和步骤&#…

智能改写工具,一键改写文章效率非常高

在当今快节奏的时代&#xff0c;效率成为了人们追求的重要目标之一。在文章创作领域&#xff0c;智能改写工具的出现为我们带来了极大的便利&#xff0c;它的高效率一键改写优势可以帮助创作者在几秒的时间里完成文章改写的工作&#xff0c;从此&#xff0c;也让创作者们实现了…

小明同学的考试分数统计:总分、平均分与方差计算进阶

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、原始方法介绍与问题发现 原始方法存在的问题 二、优化方案&#xff1a;使用列表简化代…

【OpenVINO™】在C#中使用 OpenVINO™ 部署 YOLOv10 模型实现目标

文章目录 1. 前言1.1 OpenVINO™ C# API1.2 YOLOv10 2. 模型获取2.1 源码下载2.2 配置环境2.3 下载模型 3. Yolov10 项目配置3.1 项目创建与环境配置3.2 定义模型预测方法3.2.1 定义目标检测模型方法3.2.2 使用OpenVINO™ 预处理接口编译模型 3.2 模型预测方法调用 4. 项目运行…

Java通过Html(ftl模板)生成PDF实战

Java通过Html(freemarker模板)生成PDF实战, 可支持商用 技术架构 springboot freemarker [pdfbox] flying-saucer-pdf 生成流程&#xff1a; freemarker: 根据数据填充ftl模板文件&#xff0c;得到包含有效数据的html文件&#xff08;包含页眉页脚页码的处理&#xff0c…

深入剖析—【服务器硬件】与【Nginx配置】:从基础到实战

服务器硬件部分&#xff1a; Processor (CPU)&#xff1a;服务器的计算核心&#xff0c;负责处理数据和执行程序。Memory (RAM)&#xff1a;用于暂时存储和快速访问数据&#xff0c;决定了系统的运行速度和并发处理能力。Storage (HDD/SSD)&#xff1a;长期存储数据的设备&…

高性能、超小型的电源模块——TP2L-3W系列,3W 1.5KVDC 3KVDC 隔离宽范围输入,单、双输出 DC/DC 电源模块

TP2L-3W系列是一款高性能、超小型的电源模块&#xff0c;宽范围2:1,4:1输入&#xff0c;输出有稳压和连续短路保护功能&#xff0c;隔离电压为1.5KVDC、3KVDC工作温度范围为–40℃到85℃。特别适合对输出电压的精度有严格要求的地方&#xff0c;外部遥控功能对您的设计又多一项…