字符函数和字符串函数下篇(详解)


❤️ 作者简介 :RO-BERRY 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识,对纯音乐有独特的喜爱
📗 日后方向 : 偏向于CPP开发以及大数据方向,如果你也感兴趣的话欢迎关注博主,期待更新


请添加图片描述


字符函数和字符串函数2

  • 1.strstr
    • 1.1 strstr格式
    • 1.2 strstr函数的使用
    • 1.3 strstr的模拟实现
  • 2.strtok
    • 2.1 strtok格式
  • 2.2 strtok函数的使用
    • 2.2.1
  • 3.strerror
    • 3.1strerror格式
    • 3.2 strerror函数的使用
  • 3.字符分类函数
  • 后记

🍟续接上篇字符函数和字符串函数上篇(详解)
我们讲解了很多字符串函数的格式、使用技巧、模拟实现以及注意事项,但是那并没有讲完,今天我们来接着讲讲剩下的字符函数和字符串函数。


1.strstr

我们想要查明一个字符串是不是另一个字符串的子串(子串就是一个字符串全部包含在了另一个字符串中),我们应该怎么办呢?😮

🐥strstr函数就是用来验证一个字符串是否是另一个字符串的子集的函数
接下来让我们来了解一下strstr


1.1 strstr格式

char * strstr ( const char *str1, const char * str2);
  • 1.返回值为char*类型
    在www.cplusplus.com中有对其的解释在这里插入图片描述也就是说,如果第二个字符串是第一个字符串的子集,那么将会返回第二个字符串在第一个字符串的位置的首元素地址;如果不是,则会返回null,也就是空指针
  • 2.函数参数为 const char *str1, const char * str2
    str2为验证的子串,str1为源字符串

1.2 strstr函数的使用

🍖我们知道了这个函数的格式,我们还要了解其使用方法
所谓多敲多练,我们来看看实例代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char str[] = "This is a simple string";
    char* pch;
    pch = strstr(str, "simple");
    if (pch != NULL)
        strncpy(pch, "sample", 6);
    puts(pch);
    return 0;
}

输出结果:
在这里插入图片描述
我们可以看到输出的是simple string,可以说明确确实实是返回了在str中simple的首字符地址,然后输出了simple string,使用的方法也是非常简单的


1.3 strstr的模拟实现

我们清楚了这个函数的格式以及使用,我们来模拟实现一下它

char *  strstr (const char * str1, const char * str2)
{
    char *cp = (char *) str1;
    char *s1, *s2;
    if ( !*str2 )
      return((char *)str1);  //空指针返回str1的首元素地址
    while (*cp)            	 //循环字符串str1,循环到\0,while停止
   {
        s1 = cp;
        s2 = (char *) str2;
        while ( *s1 && *s2 && !(*s1-*s2) )    //str1和str2都不能为\0,并且遍历的数值相等
                    s1++, s2++;                          //str1和str2都往后一格遍历
        if (!*s2)                                             //只有如果*s2为\0的时候,也就是str2遍历完的时候为成功
            return(cp);                                    //返回此时遍历的首字符地址
        cp++;                //循环一次str1往后遍历一格
   }
    return(NULL);
}

2.strtok

当我们有邮箱地址:zhangsan@yeah.net
我们想把其中的字符分割开来,也就是想取出zhangsan、yeah和yet,我们应该怎么做呢?

🐥strtok函数就是C语言中的分片函数,我们可以通过特定的符号来将字符串分割成个个小块

2.1 strtok格式

char * strtok ( char * str, const char * sep );
  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标
    记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:
  • strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容
    并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。

2.2 strtok函数的使用

2.2.1

我们采用实例来理解它的使用:

#include<stdio.h>
#include<string>
int main()
{
	char arr[] = "zhangsan@yeah.net";
	char sep[] = "@.";
	strtok(arr, sep);
	puts(arr);
}

输出结果:
在这里插入图片描述


我们会发现,只输出了第一个分割符号之前的字符串,也就是分片后的第一个字符串,射说明我们的arr的确是被修改了,那到底修改了什么呢?🤨

我们来看看arr里存储的是什么:
我们先用strlen(arr)计算数组长度来循环输出arr


#include<stdio.h>
#include<string>
int main()
{
	char arr[] = "zhangsan@yeah.net";
	char sep[] = "@.";
	strtok(arr, sep);
	puts(arr);
	for (int i = 0; i < strlen(arr)); i++)
		printf("arr[%d]=%c\n",i, arr[i]);
	return 0;
}

发现输出结果为:
在这里插入图片描述


🎄我们上次讲过,strlen函数是以\0为结束判断条件,那就证明要么是arr后面的元素都被删除了,要么是后面一个元素变成了\0;
接下来我们在使用sizeof来遍历,它不会以\0为终止
在这里插入图片描述
可以看到,我们的arr后面的内容并没有删除,而是将第一个遇到的分隔符转换成了\0,这样的话我们可以输出分割出来的第一个字符串。


🎈上例,我们可以看到,strtok是可以改变源字符串的内容的,会将遇到的第一个分割符号改写为\0,所以我们如果不希望修改源字符串,我们需要去拷贝一个新的字符数组。

那么我们知道了其使用原理,那么我们如何将所有的想要的字符串打印出来呢?

strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。 如果字符串中不存在更多的标记,则返回 NULL 指针。

我们再来通过代码进行验证;

#include<stdio.h>
#include<string>
int main()
{
	char arr[] = "zhangsan@yeah.net";
	char sep[] = "@.";
	char copy[20];
	strcpy(copy, arr);
	char* ret = NULL;
	for (ret = strtok(copy, sep); ret != NULL; ret = strtok(NULL, sep))
		printf("%s\n", ret);
	return 0;
}

输出结果为:在这里插入图片描述


通过利用其性质,我们就可以完成我们想要的操作
🍟这个函数使用的比较少我们可以稍作了解,知道这个函数的使用就可以了

3.strerror

🧈【扩展】库函数在执行的时候,发生了错位,会将一个错误码存放在errno这个变量中,errno是C语言提供的一个全局的变量
错误信息会转换为错误码,错误码在计算机中用0、1、2、3等编号代替

🐥strerror函数是帮我们实现错误报告的函数,它可以将错误码转换成错误信息,我们就可以知道错误是什么

3.1strerror格式

char * strerror ( int errnum );
  • 1.char*返回的是错误码对应的错误信息首字符地址
  • 2.参数是错误码

3.2 strerror函数的使用

我们先来看看计算机中错误有哪些:


int main()
{
	for (int i = 0; i < 10; i++)
		printf("错误码i:%s\n", i, strerror(i));
	return 0;

}

输出结果为:
在这里插入图片描述


通过这个函数我们可以清晰的看到错误码对应的错误信息是啥

接下来我们来测试一下:
在这里插入图片描述
🎄文件操作后面会涉及到,这里我们简略讲解一下:

  • 文件的操作需要打开,读写,关闭,我们在打开也就是fopen的时候,需要传入文件名以及读还是写的操作,“r”就是读(read),“w”就是写(write)

由于我们没有创建data.txt,我们这里故意创造了一个错误,但不是编译错误,再输出错误码对应的错误信息。
它说没有对应的文件,正好是我们想要的错误
我们这里扩展一个函数:perror
在这里插入图片描述⚡perror函数可以省略printf函数,很简便,同时能转换错误码的信息,前面输出我们出现错误的操作,但是这个函数需要我们对应需要检测的操作,而strerror函数只需要给它错误码即可

3.字符分类函数

我们的字符有很多种形式,有数字,小写字母,大写字母,空格等等;
计算机可以帮我们识别出他们吗?
接下来让我们看看字符分类函数:

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母af,大写字母AF
islower小写字母a~z
isupper大写字母A~Z
isalpha字母az或AZ
isalnum字母或者数字,az,AZ,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

这就是我们相关的字符分类函数,我们只需要稍做了解,重点还是前面的字符串函数。

后记

我们的字符函数以及字符串函数讲解就到此为止了,其他内容敬请关注。希望我所写的博客能对你有所帮助,编程学习之路还很漫长,需要我们一点一滴去积累
低头赶路,敬事如仪
自知自心,其路则明

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

el-popover在原生table中,弹出多个以及内部取消按钮无效问题

问题&#xff1a;当el-popover和原生table同时使用的时候会失效&#xff08;不是el-table) <el-popover placement"bottom" width"500" trigger"click" :key"popover-${item.id}"></el-popover> 解决&#xff1a; :key…

C程序环境及预处理

​​​​​文章目录 一、程序的翻译环境和执行环境 1.程序编译过程 2.编译内部原理 3.执行环境 二、程序运行前的预处理 1.预定义符号归纳 2.define定义标识符 3.define定义宏 4.define替换规则 5.宏和函数的对比 三、头文件被包含的方式 四、练习&#xff1a;写一…

【python工具】html中表格转化为excel

背景 大家在实际的工作中可能会遇到这样的场景,查看某个统计的页面数据,其中一些数据是表格形式展示的,比如这是国家统计局关于人口统计的数据: 你想将表格内容下载下来根据自己的需要进行二次加工,但是页面没有提供下载功能或者需要你登陆才能下载。那么重点来了~~ 操…

科大讯飞-脑PET图像分析和疾病预测挑战赛(一)

报错尝试&#xff1a; sklearn安装 后面根据一篇博客才知道&#xff0c;sklearn不能直接安装&#xff0c;需要先安装scipy 最后就能直接运行了&#xff0c;但是又出现了一大难点&#xff0c;numpy包有报错了&#xff0c;不得不说&#xff0c;dependance尤其严重。暂时没想到很…

基于大模型的Text2SQL微调的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

配置NFS服务

环境 环境 ubuntu 10.4 vm 7.1 终端 ifconfig 得到 ubuntu资料 INET ADDR 192.168.0.4 BCAST 192.168.0.255 MASK 255.255.255.0 操作前先关闭防火墙 关闭防火墙&#xff1a; 命令&#xff1a;sudo ufw disable 打开防火墙 命令&#xff1a;sudo ufw enable 配置过程 一 安…

uniapp 微信小程序 Picker下拉列表数据回显问题

效果图&#xff1a; 1、template <template><view class"items select-box"><view class"items-text">品牌型号</view><picker change"bindBrandType" :value"brandIndex" :range"brandList"…

电脑新装系统优化,win10优化,win10美化

公司发了新的笔记本&#xff0c;分为几步做 1.系统优化,碍眼的关掉。防火墙关掉、页面美化 2.安装必备软件及驱动 3.数据迁移 4.开发环境配置 目录 目录复制 这里写目录标题 目录1.系统优化关掉底部菜单栏花里胡哨 2.安装必备软件及驱动新电脑安装360 1.系统优化 关掉底部菜单…

Git远程操作

Git远程操作 理解分布式版本控制系统什么是版本控制系统&#xff1f;常见的版本控制系统 远程仓库新建远程仓库克隆远程仓库git clone使⽤HTTPS⽅式使⽤SSH⽅式git remote 向远程仓库推送git push 拉取远程仓库git pull 配置Git忽略特殊⽂件git check-ignore给命令配置别名 理解…

【软件测试】如何选择回归用例

目录 如何在原始用例集中挑选测试用例 具体实践 总结 本文讨论一下在回归测试活动中&#xff0c;如何选择测试用例集。 回归测试用例集包括基本测试用例集&#xff08;原始用例&#xff09;迭代新增测试用例集&#xff08;修复故障引入的用例和新增功能引入的用例集&#xf…

SQL调优教程

SQL调优教程 基础方法论 任何计算机应用系统性能问题最终都可以归结为 1.cpu消耗 2.内存使用 3.对磁盘&#xff0c;网络或其他I/O设备的输入/输出(I/O)操作 遇到性能问题时&#xff0c;要判断的第一点就是“在这三种资源中&#xff0c;是否有哪一种资源达到了有问题的程度”&…

质效两全:媒体服务的创新“顶设”

做媒体服务&#xff0c;一定要有刻入骨髓的抽象思维。 视频化浪潮汹涌、生成式人工智能AIGC极速迭代、体验需求和应用场景愈发多样......面对“视频生产力”的变革&#xff0c;我们能否透过纷繁复杂的表象&#xff0c;洞察音视频行业的“真正需求”&#xff1f; 是否存在一套…

【Python学习笔记】记载解决Python报错HTTP Error 403: Forbidden的一波三折过程

【Python学习笔记】记载解决Python报错HTTP Error 403: Forbidden的一波三折过程 当前进度&#xff1a;还没有解决&#xff0c;但是已经尝试了好几种办法&#xff0c;此处做个记录&#xff0c;也许能帮上忙。 本帖是整理回顾帖&#xff0c;不是教程帖&#xff0c;追求一个完美…

在 Windows 中通过 WSL 2 高效使用 Docker

大家好&#xff0c;我是比特桃。平时开发中&#xff0c;不免会使用一些容器来跑中间件。而开发者使用的操作系统&#xff0c;大多是Mac OS 、Windows。Docker 为了兼顾这两个平台的用户&#xff0c;推出了 Docker Desktop 应用。Docker Desktop 中的内核还是采用了 Linux 的内核…

智能合约安全审计

智能合约安全审计的意义 智能合约审计用于整个 DeFi 生态系统&#xff0c;通过对协议代码的深入审查&#xff0c;可以帮助解决识别错误、低效代码以及这些问题。智能合约具有不可篡改的特点&#xff0c;这使得审计成为任何区块链项目安全流程的关键部分。 代码审计对任何应用…

基于OpenCV的红绿灯识别

基于OpenCV的红绿灯识别 技术背景 为了实现轻舟航天机器人实现红绿灯的识别&#xff0c;决定采用传统算法OpenCV视觉技术。 技术介绍 航天机器人的红绿灯识别主要基于传统计算机视觉技术&#xff0c;利用OpenCV算法对视频流进行处理&#xff0c;以获取红绿灯的状态信息。具…

Qt5.14.2下载及安装

1. 下载 https://download.qt.io/archive/qt/5.14/5.14.2/ 由于Qt 自从5.15版本开始&#xff0c;对非商业版本&#xff08;也就是开源版本&#xff09;&#xff0c;不提供已经制作好的离线exe安装包。所以&#xff0c;对于5.15&#xff08;含&#xff09;之后的版本&#xff…

苹果账号被禁用怎么办

转载&#xff1a;苹果账号被禁用怎么办 目录 禁用的原因 解除Apple ID禁用 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UKQ1ILhC-1689932607373)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw)]​编辑 …

MySQL的主从复制练习

基本原理图如下&#xff1a; 主从复制&#xff08;也称 AB 复制&#xff09;允许将来自一个MySQL数据库服务器&#xff08;主服务器&#xff09;的数据复制到一个或多个MySQL数据库服务器&#xff08;从服务器&#xff09;。当主库进行更新的时候&#xff0c;会自动将数据复制到…

从C到C++ | C++入门(三)

目录 内联函数 auto 关键字 范围for 指针空值nullptr 内联函数 以inline修饰的函数叫内联函数&#xff0c;编译时C编译器会在调用函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;可提升程序的运行效率。 例子&#xff1a; #include <iostream> …