字符串函数!!!(续)(C语言)

news2024/11/23 20:21:46

一. strtok函数的使用

继续上次的学习,今天我们来认识一个新的函数strtok,它的原型是char* strtok(char* str,const char* sep),sep参数指向了一个字符串,定义了用作分隔符的字符合集,第一个参数指定⼀个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串⼀般都是临时拷贝的内容并且可修改。)
让我们来实践一下:下面展示一些 内联代码片

int main()
{
	char arr[] = { "zftdg@gsf.hgd" };
	char* p = "@.";
	char* ret = strtok(arr, p);
	printf("%s\n", ret);
	char* ret1 = strtok(NULL, p);
	printf("%s\n", ret1);
	char* ret2 = strtok(NULL, p);
	printf("%s\n", ret2);
	return 0;

}

在这里插入图片描述
从上面的代码可以看出,我们定义了一个指针p指向了分隔符@和. 最终我们实现了数组arr的分割,而我们也注意到strtok函数的第一个参数为数组arr,但是后面的参数是NULL,因为函数strtok将在第一个字符串被保存的位置查找下一个标记,所以后面的参数设置成NULL,原因是为了让函数记住上一次分割的位置,而不是从头开始

二. strstr函数的使用和模拟实现

strstr函数的原型是char * strstr ( const char * str1, const char * str2); 它的作用是在str1这个字符串中找到str2这个字符串。它具体是怎么使用的呢?让我们来实践一下:在这里插入图片描述
下面展示一些 内联代码片

#include <stdio.h>
#include <string.h>
int main ()
{
 char str[] ="This is a simple string";
 char * pch;
 pch = strstr (str,"simple");
 strncpy (pch,"sample",6);
 printf("%s\n", str);
 return 0;
}

在这里插入图片描述
首先定义一个char*类型的指针pch,使用strstr函数在定义好的str字符串中找到simple这个字符串再返回给pch,然后我们再使用strncpy函数打印出来pch,结果如上图所示。那么我们自己如何来模拟实习呢?在这里插入图片描述
看到上面的图片,我们究竟要怎样设置我们的strstr函数呢?为什么要设置这么多的指针呢?我们直接来看第二种情况,str1和str2分别指向数组的首元素地址,但是正因为需要多次匹配,我们才需要一个一直指向首元素的指针地址,所以我们创建了s1和s2两个指针,将s1和s2移动来判断两个数组中的元素是否相等,至于cur指针,它的作用就是记录第一个相等的元素,让我们用代码说明:首先我们要保证各个指针不是空指针,根据上面的图片,先让cur指针等于str1指针,使用while循环:下面展示一些 内联代码片

while(*cur!='\0')
{
    s1=cur;
    s2=str2;
    while(*s1!='\0' && *s2!='\0'&& *s1==*s2)
   {
      s1++;
       s2++;
   }
   if(*s2=='\0')
       return cur;
   cur++;
}

上面的代码虽然不完整,但是也有一定的实用性了,我们先让s1和s2分别位于数组的首元素地址,然后进入一个循环,如果s1等于s2说明此时有可能找到一样的字符,那我们就让s1++和s2++,一旦s1和s2不相等,我们就跳出循环,直接让我们的cur++,找到下一个字符再重新开始,比如上图中,当arr数组中的a和p数组中的字符b不相等时,我们直接让cur++,然后再将cur指针重新赋给s1,此时的s1就指向字符b,而s2也指向字符b,那么我们就进入了第二个while循环,条件是s1和s2相等,如果不相等,就跳出第二个循环,说明不匹配,再让cur++,指向下一个字符,再重新开始匹配,当我们s1和s2再一次++,s1指向arr数组中的第二个b,而p中的s2指向了字符c,此时不满足条件,跳出循环,然后cur++,再重新开始,那么此时如果再将cur赋给s1的话,便是指向arr数组中的第二个b,如果从此刻开始,我们就算是匹配成功了,大家下去可将这个过程自己演示一遍.

下面展示一些 内联代码片

char* my_strstr(const char* str1, const char* str2)
{
	assert(str1 && str2);
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = str1;
	while(*cur!='\0')
{
    s1=cur;
    s2=str2;
    while(*s1!='\0' && *s2!='\0'&& *s1==*s2)
   {
      s1++;
       s2++;
   }
   if(*s2=='\0')
       return cur;
   cur++;
}
return NULL;
}

三. strerror函数的使用

我们来学习下一个函数strerror函数,它的原型是char* strerror ( int errnum ); strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
我们来举一个例子:下面展示一些 内联代码片

#include <errno.h>
#include <string.h>
#include <stdio.h>
//我们打印⼀下0~10这些错误码对应的信息
int main()
{
	int i = 0;
	for (i = 0; i <= 10; i++) 
	{
		printf("%s\n", strerror(i));
	}
	return 0;
}

在这里插入图片描述
在以后的使用中我们可能会用到上述函数,当我们理解这些函数的内部结构以及作用我们使用起来才会更加得心应手.在这里插入图片描述

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

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

相关文章

DataStream API的Joining操作

目录 Window Join Tumbling Window Join Sliding Window Join Session Window Join Interval Join Window CoGroup Window Join 窗口连接&#xff08;window join&#xff09;将两个流的元素连接在一起&#xff0c;这两个流共享一个公共键&#xff0c;并且位于同一窗口。…

从老旧到智慧病房,全视通智慧病房方案减轻医护工作负担

传统的老旧病房面临着诸多挑战。例如&#xff0c;患者风险信息的管理仍依赖于手写记录和人工核查&#xff1b;病房呼叫系统仅支持基本的点对点呼叫&#xff0c;缺乏与其它系统的集成能力&#xff1b;信息传递主要依靠医护人员口头传达&#xff1b;护理信息管理分散且不连贯&…

JavaEE-多线程

前情提要&#xff1a;本文内容过多&#xff0c;建议搭配目录食用&#xff0c;想看哪里点哪里~ PC端目录 手机端目录 话不多说&#xff0c;我们正式开始~~ 目录 多线程的概念进程和线程的区别和联系:使用Java代码进行多线程编程Thread类中的方法和属性线程的核心操作1. 启动…

【mamba学习】(一)SSM原理与说明

mamba输入输出实现与transformer几乎完全一样的功能&#xff0c;但速度和内存占用具有很大优势。对比transformer&#xff0c;transformer存在记忆有限的情况&#xff0c;如果输入或者预测的序列过长可能导致爆炸&#xff08;非线性&#xff09;&#xff0c;而mamba不存在这种情…

物理网卡MAC修改器v3.0-直接修改网卡内部硬件MAC地址,重装系统不变!

直接在操作系统里就能修改网卡硬件mac地址&#xff0c;刷新网卡mac序列号硬件码机器码&#xff0c;电脑主板集成网卡&#xff0c;pcie网卡&#xff0c;usb有线网卡&#xff0c;usb无线网卡&#xff0c;英特尔网卡&#xff0c;瑞昱网卡全支持&#xff01; 一键修改mac&#xff0…

百问网全志系列开发板音频ALSA配置步骤详解

8 ALSA 8.1 音频相关概念 ​ 音频信号是一种连续变化的模拟信号&#xff0c;但计算机只能处理和记录二进制的数字信号&#xff0c;由自然音源得到的音频信号必须经过一定的变换&#xff0c;成为数字音频信号之后&#xff0c;才能送到计算机中作进一步的处理。 ​ 数字音频系…

MySQL本地Windows安装

下载MySQL 官网&#xff1a;MySQL 下载完成后文件 安装类型 选择功能 功能过滤筛选&#xff0c;系统为64位操作系统&#xff0c;所以选【64-bit】&#xff0c;32位可选【32.bit】 下方勾选后自动检查安装环境&#xff0c;如果提示缺少运行库&#xff0c;请先安装VC_redist.x64。…

【Dash】plotly.express 气泡图

一、More about Visualization The Dash Core Compnents module dash.dcc includes a componenet called Graph. Graph renders interactive data visualizations using the open source plotly.js javaScript graphing library.Plotly.js supports over 35 chart types and …

数据结构 之 二叉树功能的代码实现

文章目录 二叉搜索树搜索删除节点二叉树的遍历 代码实现 二叉搜索树 无序树的查找&#xff0c;就是整个遍历&#xff0c;所以时间复杂度为O(N)。为了优化无序查找的时间复杂度&#xff0c;我们把树进行排序&#xff0c;这里引入了二叉搜索树。 二叉搜索树是一个有序树&#xf…

vue el-select下拉框在弹框里面错位,

1&#xff1a;原因是因为 底层滚动条滚动的问题。 2&#xff1a;解决方案 加上这个属性 :popper-append-to-body"false" 和样式 <el-select:popper-append-to-body"false"> </el-select><style> .el-select .el-select-dropdown {t…

数据埋点系列 4|数据分析与可视化:从数据到洞察

在前面的文章中,我们讨论了数据埋点的基础知识、技术实现以及数据质量保证。现在,我们拥有了高质量的数据,是时候深入挖掘这些数据的价值了。本文将带你探索如何通过数据分析和可视化,将原始数据转化为有价值的业务洞察。 目录 1. 数据分析基础1.1 描述性统计1.2 推断统计1.3 相…

Haproxy的配置详解与使用

一、haproxy简介 HAProxy是一个使用C语言编写的自由及开放源代码软件&#xff0c;其提供高可用性、负载均衡&#xff0c;以及基于TCP和HTTP的应用程序代理。 HAProxy特别适用于那些负载特大的web站点&#xff0c;这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬…

uniapp实现自定义弹窗组件,支持富文本传入内容

1.首先安装vuex 通过此命令安装 ​​npm install vuex --save​​ 创建initModal.js import Vuex from vuex // 自定义弹窗 export default function initModal (v) {// 挂在store到全局Vue原型上v.prototype.$modalStore new Vuex.Store({state: {show: false,title: 标题,c…

【人工智能】深入理解自监督学习中的表征学习与对比学习

我的主页&#xff1a;2的n次方_ 1. 自监督学习 1.1 自监督学习的概念 自监督学习是一种无需大规模标注数据的学习方法&#xff0c;通过构造代理任务&#xff0c;模型可以从数据本身获取监督信号&#xff0c;从而学习有用的特征表征。 1.2 自监督学习的背景与重要性 在当今大…

【C++进阶学习】第十三弹——C++智能指针的深入解析

前言&#xff1a; 在C编程中&#xff0c;内存管理是至关重要的一个环节。传统的手动内存管理方式容易导致内存泄漏、悬挂指针等问题。为了解决这些问题&#xff0c;C引入了智能指针。本文将详细讲解C中智能指针的概念、种类、使用方法以及注意事项。 目录 一、引言 二、智能指…

链表---数据结构-黑马

链表 定义 链表是数据元素的线性集合&#xff0c;其每个元素都指向下一个元素&#xff0c;元素存储上是不连续的。 分类 单向链表&#xff0c;每个元素只知道自己的下一个元素是谁。 双向链表&#xff0c;每个元素知道自己的上一个元素和下一个元素。 循环链表&#xff0c;…

分布式锁:Mysql实现,Redis实现,Zookeeper实现

目录 前置知识 Mysql实现分布式锁 1.get_lock函数 Java代码实现&#xff1a; 2.for update尾缀 Java代码实现&#xff1a; 3.自己定义锁表 Java代码实现&#xff1a; 4.时间戳列实现乐观锁 Java代码实现&#xff1a; Redis实现分布式锁 Zookeeper实现分布式锁&#…

Oracle搭建一主两备dataguard环境的详细步骤

​ 上一篇文章介绍了Oracle一主两备的DG环境&#xff0c;如何进行switchover切换&#xff0c;也许你会问Oracle一主两备dataguard环境要怎么搭建&#xff0c;本篇文章将为你讲述一主两备dataguard详细搭建步骤。 环境说明 主机名IP地址db_unique_name数据库角色ora11g10.10.1…

驱动数智化升级,AI大模型准备好了吗?

大数据产业创新服务媒体 ——聚焦数据 改变商业 AI大模型的快速崛起&#xff0c;为企业带来了前所未有的变革机遇。从自然语言处理到图像识别&#xff0c;从精准营销到智能制造&#xff0c;AI大模型正逐步渗透到各行各业的核心业务中。然而&#xff0c;随着技术的不断演进&…

力扣刷题-循环队列

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 思路&#xff1a; 我们在这里采用的是用数组的形式实现循环链表&#xff0c;我认为这个用数组是更为简单的&#xff0c;我们只需要控制下标就可以实现循环链表的效果。具体实现代…