C语言之字符函数字符串函数篇(2)

目录

字符串查找

strstr

strstr的使用

strstr的模拟实现 

分析 

考虑点 

代码 

strt

strtok的使用

循环改进 

错误信息报告 

strerror

错误码的错误信息

strerror的使用 

perror

字符操作

字符分类函数

字符转化函数


今天我们接着讲字符串函数,也会讲到字符函数。关于下面的字符串函数我们将从:作用  头文件  参数 返回值 等方面去介绍。🆗🆗

字符串查找

strstr

 strstr - C++ Reference

  •  strstr_string string库函数,是在字符串中找字符串
  • const char * strstr ( const char * str1, const char * str2 ); 本质上就是在str1去查找str2strstr会返回str1中str2第一次出现的位置如果str1中没有str2,返回NULL
  • 头文件#include<string.h>
  • 参数:两个字符串的指针
  • 返回值:str1中str2第一次出现的位置
  • strstr的模拟

strstr的使用

#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "abcdefdhidefghi";char arr2[] = "def";const char* ret=strstr(arr1, arr2);//arr2第一次出现的位置if (ret == NULL)printf("找到不到");elseprintf("%s", ret);return 0;
}

 

strstr的模拟实现 

分析 

在我们的arr1中查找arr2中有很多种情况如下图: 

当然最后一种情况我们还可以分为比较复杂的情况如下图:

 

考虑点 

所以综上我们需要考虑:

  •  str1和str2一开始就为空情况
  • 在遍历过程中*s1为'\0' *s2为'\0'情况
  • 创建str1和str2去记录 记录arr1和arr2的起始位置
  • 创建s1和s2去遍历查找匹配比较
  • 创建cp为了记录可能匹配成功的arr1中arr2第一次出现位置的地址
  • 两个循环条件
  • 当情况比较复杂的时候,请不要改变字符串起始位置的指针变量,创建其他的指针去查询。
  • const
  • assert

代码 
#include<stdio.h>
#include<string.h>
const char* my_strstr(const char* str1, const char* str2)
{const char* cp;//记录开始匹配的位置,可能arr1中arr2第一次出现的位置const char* s1;//遍历str1指向的字符串const char* s2;//遍历str2指向的字符串//char*str1;//char*str2;assert(str1 && str2);cp = str1;//不改变初始位置的值while (*cp)//等于'\0'返回NULL{s1 = cp;//不改变cp的值s2 = str2;//不改变str2的值while (*s1 && *s2 && *s1 == *s2)//*s1 =='\0',arr1提前遇到'\0'找到不到了返回null//*s2 == '\0'arr2全部遍历匹配成功,返回此刻的cp//== 相等进入循环开始遍历匹配比较{s1++;s2++;//直到它们不相等跳出循环,找到下一个cp的位置继续查询}if (*s2 == '\0')return cp;//*s2 arr2全部匹配成功遇到'\0'//一开始*str2 == '\0'cp++;}return NULL;//一开始*str1 == '\0'//*s1 中途遇到'\0'(即arr1长度<arr2)//arr1全部遍历完也没有匹配的
}
int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbc";const char* ret = my_strstr(arr1, arr2);//arr2第一次出现的位置if (ret == NULL)printf("找不到");elseprintf("%s", ret);return 0;
}
#include<stdio.h>
#include<string.h>
const char* my_strstr(const char* str1, const char* str2)
{const char* cp;const char* s1;const char* s2;assert(str1 && str2);cp = str1;while (*cp){s1 = cp;s2 = str2;while (*s1 && *s2 && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')return cp;cp++;}return NULL;
}
int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbc";const char* ret = my_strstr(arr1, arr2);if (ret == NULL)printf("找不到");elseprintf("%s", ret);return 0;
}

strt

strtok - C++ Reference

tsqxgd@yeah.net
192.168.101.23// IP地址_点分十进制的表示方法
//IP地址本来是一个无符号的整数,这种整数不方便记忆,所以将这个整数换成点分十进制的表示方法分割符:
"@."//不讲究顺序
"."
char * strtok ( char * str, const char * sep );
  • 第二参数char *sep参数是个字符串,定义了用作分隔符的字符集合

  • 第一个参数char * str指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记

  • 头文件:#include<string.h>

  • 有可分割的字符串返回标记的指针

  • 无可分割的字符串返回NULL

  • 分割过程:

  1. strtok函数找到str中的一个标记。

  2. 利用sep找到这个标记的分隔符,并将标记用 \0 结尾(将标记末尾的分隔符改变成'\0')

  3. 返回一个指向这个标记的指针

  4. 保存这个标记在字符串中的位置(以方便分割下一个标记)。

  5. 特别注意:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改

  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

  • 如果字符串中不存在更多的标记,则返回 NULL 指针。停止分割

  • 因为切割字符串的过程中会改变原字符串的内容,所以我们可以先拷贝到临时空间,再对临时空间进行拷贝。

  • 若分割符和分割符相邻,会跳过。

  • 那到底strtok是怎样保存标记在字符串的位置呢?可能是static

strtok的使用

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "tsqxgd@yeah.net";char buf[200] = { 0 };//放到临时的空间里,防止原arr被改变strcpy(buf, arr);char* sep = "@.";char* ret = strtok(buf, sep);printf("%s\n", ret);ret = strtok(NULL, sep);printf("%s\n", ret);ret = strtok(NULL, sep);printf("%s\n", ret);return 0;
}

 

循环改进 

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "tsqxgd@yeah.net";char buf[200] = { 0 };//放到临时的空间里,防止原arr被改变strcpy(buf, arr);char* sep = "@.";char* ret = NULL;//ret为空for (ret = strtok(buf, sep); ret != NULL; ret=strtok(NULL, sep)){printf("%s\n", ret);}return 0;
}

错误信息报告 

strerror

strerror - C++ Reference (cplusplus.com)

  •  strerror是库函数,将错误码翻译成错误信息,返回错误信息的字符串的起始地址
  • 头文件:#include<string.h>
  • 参数:错误码(整型)
  • 返回值:返回错误信息的字符串起始地址
  • C语言中使用库函数的时候,如果发生错误,就会将错误码放在errno的变量中。
  • errno是一个全局变量,可以直接使用
char * strerror ( int errnum );

错误码的错误信息

/* strerror example : error list */
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main()
{int i = 0;for (i = 0; i < 10; i++)//错误码{printf("%d:%s\n", i, strerror(i));//错误信息}return 0;
}

 

strerror的使用 

那上面只是我们查看一下各个错误码对应的错误信息,那在具体的情况下,我们应该怎样使用呢?

/* strerror example : error list */
//打开文件的例子
//foopen以读的形式打开文件
//如果文件存在,打开成功
//如果文件不存在,打开失败
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main()
{FILE* pFile;pFile = fopen("unexist.ent", "r");if (pFile == NULL)printf("打开文件失败原因是: %s\n", strerror(errno));elseprintf("打开文件成功\n");return 0;
}

perror

perror - C++ Reference (cplusplus.com)

  •  直接打印错误码所对应的错误信息
  •  perror == printf +strerror
//打开文件的例子
//foopen以读的形式打开文件
//如果文件存在,打开成功
//如果文件不存在,打开失败
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main()
{FILE* pFile;pFile = fopen("unexist.ent", "r");if (pFile == NULL)perror("打开文件失败");//== printf+strerrorelseprintf("打开文件成功\n");return 0;
}

字符操作

字符分类函数

关于字符分类函数我们就不一一讲解,大家通过查询网站,和从参数,返回值等方面去分析这些函数。注意字符函数的头文件是#include<ctype.h>

 <cctype> (ctype.h) - C++ Reference (cplusplus.com)

 中文表格 

字符转化函数

<cctype> (ctype.h) - C++ Reference (cplusplus.com)

#include <stdio.h>
#include <ctype.h>
int main()
{int ret = toupper('a');printf("%c\n", ret);ret = tolower(ret);printf("%c\n", ret);return 0;
}

我们用字符转化函数来实现一个简单的功能吧🆗🆗

将arr字符串数组中的大写转化成小写

#include <stdio.h>
#include <ctype.h>
int main()
{char arr[] = "Text String";//全部转化成小写int* p = arr;while (*p){if (isupper(*p)){*p = tolower(*p);}p++;}printf("%s", arr);return 0;
}

 char类型可以放到int类型的变量中去;

 但是int类型不可以放到char类型的变量中去

✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正!下篇博文我们介绍内存函数。

希望我们都能够熠熠生辉,旗鼓相当。

代码------→【gitee:唐棣棣 (TSQXG) - Gitee.com】

联系------→【邮箱:2784139418@qq.com】

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

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

相关文章

balenaEtcher格式化的U盘恢复原来样子

今天用balenaEtcher烧录了U盘&#xff0c;刷机N1盒子openwrt, 刷完机结果发现自己的U盘电脑最后只有167M 想要恢复原来的64G以下是方法&#xff0c;使用win10系统 1、打开命令行cmd&#xff08;winr打开运行&#xff0c;在其中输入cmd就可以打开&#xff09;&#xff1b; 2…

C++QT day11

绘制时钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent>//绘制事件类 #include <QDebug>//信息调试类 #include <QPainter>//画家类 #include <QTimer>//定时器类 #include <QTime> #include &…

Android---打开相机拍照

简单实现打开系统系统相机拍一张图片并显示在UI上&#xff0c;适用与个人主页头像的切换。 1. 添加权限。AndroidManifest.xml里添加使用相机的权限。 <uses-permission android:name"android.permission.CAMERA"/> 2. 布局。布局内容比较交单&#xff0c;一…

leetcode21合并两个有序链表

题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输…

智慧农业农场小程序源码 智慧农场系统源码

智慧农业农场小程序源码 智慧农场系统源码 一、 智慧农场系统的组成 智慧农场系统一般包括传感器、控制器、数据采集与处理平台、应用软件等组成部分。其中, 传感器主要用于采集土壤温度、湿度、光照强度等环境参数,以及作物生长状态、水肥情况等生产信息。控制器则根据传感器…

一个关于 i++ 和 ++i 的面试题打趴了所有人

前言 都说大城市现在不好找工作&#xff0c;可小城市却也不好招人。 我们公司招了挺久都没招到&#xff0c;主管感到有些心累。 我提了点建议&#xff0c;是不是面试问的太深了&#xff0c;在这种小城市&#xff0c;能干活就行。 他说自己问的面试题都很浅显&#xff0c;如果答…

你写过的最蠢的代码是?

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Parseval’s Theorem Parseval’s Identity of Fourier Transform

https://www.tutorialspoint.com/parseval-s-theorem-and-parseval-s-identity-of-fourier-transform

最新AI创作系统+ChatGPT网站源码+支持GPT4.0+支持ai绘画+支持国内全AI模型

一、AI创作系统 SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统&#xff1f;小编这里写一个详细图文教程吧&#x…

Unity引擎更新收费模式:从收入分成转向游戏安装量,将会有哪些影响呢

一、前言 Unity 引擎宣布自 2024 年 1 月 1 日起&#xff0c;将根据游戏安装量对开发者进行收费。官网通知如下 收费模式如图 这张图的大致意思就是&#xff0c; 从2024年1月1日开始&#xff0c;Unity将对所有达标的用户&#xff08;开发者&#xff09;根据游戏安装量征收“安…

ARM Linux DIY(十三)Qt5 移植

前言 板子带有屏幕&#xff0c;那当然要设计一下 GUI&#xff0c;对 Qt5 比较熟悉&#xff0c;那就移植它吧。 移植 Qt5 buildroot 使能 Qt5&#xff0c;这里我们只开启核心功能 gui module --> widgets module 编译 $ make ODIY_V3S/ qt5base编译报错&#xff1a;找不…

Windows11系统C盘用户文件夹下用户文件夹为中文,解决方案

说明&#xff1a; 1. 博主电脑为Windows11操作系统&#xff0c;亲测有效&#xff0c;修改后无任何影响&#xff0c;软件都可以正常运行&#xff01; 2. Windows10系统还不知道可不可行&#xff0c;因为Windows11的计算机管理中没有本地用户和组&#xff0c;博主在csdn上看到很…

【斗罗2】霍雨浩实力被否定,超级斗罗眼光被嘲,魂导院成功捡漏

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗罗大陆2绝世唐门。 最新一集《绝世唐门》已经更新&#xff0c;相信不少小伙伴和小郑一样都已经先睹为快&#xff0c;本集虽然是过渡剧情&#xff0c;但本身还是有不少有意思的剧情&#xff0c;作为过渡文戏也算是可圈可…

网工基础知识——以太网

1972年Bob Metcalfe“以太网之父”被Xerox雇佣为网络专家&#xff0c;Bob Metcalfe 来到Xerox公司的Palo Alto研究中心&#xff08;PARC&#xff09;的第一个任务是把Palo Alto的计算机连接到ARPANET&#xff08;Internet的前身&#xff09;上。1972年底Bob Metcalfe以ALOHA系统…

修改配置maven镜像仓库位置,将maven镜像更换成阿里镜像

大家都知道Maven默认连接的仓库位置https://repo .maven.apache.org/maven2访问国外镜像下载东西时相对较慢&#xff0c;所以多数朋友想切换到国内镜像&#xff0c;国内阿里已经给大家提供了一套完整的镜像供大家使用。 Maven默认连接的仓库位置 <repositories><repos…

【1++的Linux】之进程(三)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;什么是进程地址空间&#xff1f;二&#xff0c;进程地址空间是怎么设计的&#xff1f;三&#xff0c;为什么要有进程地址空间&#xff1f; 一&#xff0c;什…

Parasoft Jtest 2023.1

Parasoft Jtest 2023.1 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

Linux系统100条命令:关于Ubuntu和 CentOS 7 相同功能的不同的终端操作命令

安装软件包&#xff1a; Ubuntu&#xff1a;apt-get install package_name CentOS 7&#xff1a;yum install package_name 更新软件包列表&#xff1a; Ubuntu&#xff1a;apt-get update CentOS 7&#xff1a;yum update 卸载软件包&#xff1a; Ubuntu&#xff1a;apt-…

制作学生查询小程序

学生个人成绩查询小程序&#xff0c;一款助力教师实时了解学生学习情况的便捷工具。本文将为您揭秘它的制作过程&#xff0c;并提供实用的建议。然而&#xff0c;简便易用的方法莫过于选择现有的工具。 许多教师都偏爱使用易查分来快速创建查分网站。与传统的独立开发方式不同…