C语言————字符函数与字符串函数

news2024/10/3 6:36:02

       在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,C语⾔标准库中提供了⼀系列库函数,如追加,拷贝,替换等等接下来我们就学习⼀下这些函数,并且自实现。

gets

        这个指令大家可以与我们以前常用的scanf相比较,大家都知道scanf是输入。gets从名字上看就可以知道也是输入。那么大家可以想一下,既然我们有scanf了,为什么还要搞一个gets嘞。所以我们就来说明一下gets与scanf的区别。直接看代码

    大家可以看到我在gets和scanf输入都是hi yh。但是我们调试的时候两个数组存储的结果却不一样。所以gets与scanf异同是,在指令gets执行时,你输入说明东西都可以,想让这个指令停止的话用回车键。scanf也是。但是区别是录入东西的时候,gets可以录入空格,就算是\0的话也是可以的,但是scanf却不行,上面大家可以看到scanf只录入了空格前的数据。

总结:gets,录入输入的所有东西,包括空格,\0。但scanf可以输入任意东西,但是录入的东西只有\0之前的。

puts

      既然输入有两个那么输出也要有两个吧,不然会说,工程师一碗水端平吧。那么输出就是puts,那这个与printf有什么区别嘞?

      这里我只创建了一个char类型的数组,然后puts和printf打印的结果虽然是一样的,但是大家可以看到我写数据的时候,是不一样。puts我写的是数组名arr但printf是两个数据类型。这代表puts只可以打印字符串,不能格式化。但printf可以格式化,输出多种类型的结果。所以我们平常很少使用puts。

字符分类函数


       C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h

这些函数的使用方法是一样的,那么我们就举一个例子,其他的其实就都会使用了。那么我们就写一个判断字符是否是小写字母

       我们可以看到我给字符a输入的是大写的a所以y的结果就是0.大家都知道0为假。那么大家可以知道这些函数如何使用了吧。

        然后大家看一下这个表,熟悉吧。虽然我们可能用不上全部,但是我们可以记住里面常用且简单的规律,如小写字母的ascll码整体大于大写字母32。0的ascll值为48,那么 48向后加一那么十进制的0就会加1。

        这里我们计算使用了,大小写字母相差32。然后我们还有一个库函数直接改写,大小写字母装换。

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

strlen

       这个大家应该不陌生吧。计算\0之前的个数。那么我们就直接写my_strlen。看代码

       这是我们使用递归的方法来计算的,还有两种方法,分别是遍历一遍然后在遍历的时候如果没有遇到\0,count就加加,直到遇到\0就结束并且返回值。

     然后是指针减指针。这个给大家解释一下,就是指针减指针的结果是两个指针之间的元素个数,然后我们就可以依据这个定理推断出第三中方法了

strcpy

        这个指令大家可能会比较陌生,但是我们在电脑上肯定使用的不少。它就是拷贝,如创建两个字符串数组,一个为替换数组另外一个被替换数组。并且被替换数组要有足够空间来接收替换数组的内容。接下来我们就先实现,然后再写my_strcpy。

     首先我们来一个正常版的:

     接下来就是我们自己的my_strcpy

strcat 

        这个嘞,就不是拷贝了,在C语言中代表的意思是追加。如贪吃蛇在尾部再添加一点数量的长度。C语言中代表的是追加另一个数组中的元素。当然你肯定要确定被追加的数组够大。还是老规矩先演示再my_strcat

       正常的使用方法:这里我也是为了方便直接用的上一个数值,所以有些注释没有删除

        接下来是my_strcat:

strcmp

       这个库函数就是我们日常生活中有使用过的,就是比较大小,如果前者大于后者那么就会返回一个大于0的数字,如果小于的话那么就是返回小于0的数字。比较方法的话就是利用ascll码值来对比。还是老规矩::

      正常使用strcmp

       这里大家看到了我用y来接收的返回值,打印出来的值是小于0的,那么数组arr小于数值arr1,大家可以看到这两个数组内容其实差不多的,但是只有最后一个字符不一样。所以strcmp对比是一个一个字符对比如果遇见字符相同的那么就跳到下一个字符,如果遇见可以判断大小的字符的时候,那么对比就结束了,后面的字符无论相差多少都没有关系了。并且我们知道小写字母a的ascll值为97,但是f的ascll为102。所以这里返回的就是-1。

      my_strcmp

  strncpy

       大家看到这个库函数是否会觉得有点熟悉呀,是不是感觉前面才见过啊。但大家需要仔细看一下,这个与strcpy可是多了一个n的呀,那么对于严谨的编程来说这肯定是有很大差别的,那具体是什么差别嘞,首先strncpy也是拷贝,但是strncpy可以控制拷贝的元素个数,例如下面的例子,我们只想拷贝前五个元素,其他的我觉得不重要,那么就我使用strncpy。因为如果我们使用strcpy的话就全部拷贝了。

       正常使用strncpy:我们可以看到我创建两个数组,并且拷贝元素个数在原目标数组上是有足够元素的,但如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

       my_strncpy

strncat

       既然学习过了上面的stcncpy,那么strncat是不是也可以理解的差不多了呀。strncat代表的意思是追加n个字符。n肯定是自己确定嘛。

       正常使用strncat:这里大家可以看到我们将最佳7个元素,但是arr1没有那么多的元素啊,怎么办,那就只有用\0来代替了。但是因为数组arr本身没有完全赋值,所以其他的都是用\0来代替的,所以编译器没有用红色来标注出来。

       my_strncat:

strncmp

        还是熟悉的味道,又加了一个n,那么这个就是对比n个元素,然后返回大小值了。

        正常的strncmp:

        my_strncmp:

 strstr

        这个库函数就是来确定一个数组在另外一个数组中是否存在,如果存在的话,那么就返回在数组中的出现的地方。虽然大家觉得这个库函数没什么作用呀。但其实在一些大厂的面试题中有确定是否是这个数组中的。

        正常的strstr:这里大家可以看到我们使用的是,看simple是否存在str里面,然后用pch来接收的,然后我们打印。

        my_strstr:

strtok

        这个库函数就是分割相当于,在第一个字符串中有0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记。该函数返回被分解的第一个子字符串,若无可检索的字符串,则返回空指针。strtok函数的第⼀个参数为 NULL ,函数将在同⼀个字符串中被保存的位置开始,查找下⼀个标
记。

       正常strtok:大家可以借鉴这个示例,虽然这个库函数使用的相对较少,但我们还是需要了解使用方法的。

       my_strtok:

strerror

        这个库函数嘞,我觉得就不用写模拟实现了,比较这个本来就是方便我们使用者的,要是再自己写一个的话,就太麻烦了,这个库函数,我就直接写使用方法了吧。而且这个库函数的作用是返回一个指向错误字符串的指针,该错误字符串描述了错误 errnum。相当于告诉我们有什么错误,错误是什么。

      这里的错误我就不给大家翻译了,大家如果感兴趣的话,可以自己去翻译一下。
 

       那么这些是鄙人今天想与大家分享的知识点了,当然还有一些知识点是没有写出来的,希望大家可以在评论区写出来,方便鄙人改正。

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

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

相关文章

IntelliJ IDEA 2020.2.4试用方法

打开idea,准备好ide-eval-resetter压缩包。 将准备好的压缩包拖入idea中 选中弹窗中的自动重置选项,并点击重置 查看免费试用时长

【Docker安装教程】Docker安装Redis详解

安装Redis前我们必须要保证Docker运行OK,如何安装Docker参考《CentOS 7 上的 Docker 安装与配置》 步骤 1: 拉取 Redis 镜像 首先,确保你已经安装了 Docker。然后,使用以下命令拉取最新的 Redis 镜像: docker pull redis](http…

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数---分类性能评估的利器

【Pytorch】进阶学习:深入解析 sklearn.metrics 中的 classification_report 函数—分类性能评估的利器 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合…

《互联网的世界》第五讲-信任和安全(第一趴:物理世界的非对称加密装置)

信任和安全的话题过于庞大,涉及很多数学知识,直接涉及 “正事” 反而不利于理解问题的本质,因此需要先讲一个前置作为 part 1。 part 1 主要描述物理世界的信任和安全,千万不要觉得数字世界是脱离物理世界的另一天堂,…

【C语言】字符指针

在指针的类型中我们知道有一种指针类型为字符指针char* 一般使用: int main() { char ch w; char *pc &ch; *pc w; return 0; } 还有一种使用方式,如下: int main() { const char* pstr "hello bit.";//这⾥是把⼀个字…

基于决策树实现葡萄酒分类

基于决策树实现葡萄酒分类 将葡萄酒数据集拆分成训练集和测试集,搭建tree_1和tree_2两个决策树模型,tree_1使用信息增益作为特征选择指标,B树使用基尼指数作为特征选择指标,各自对训练集进行训练,然后分别对训练集和测…

基于Java的在线课程教学系统(Vue.js+SpringBoot)

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

企业AI转型之路:策略与实践

目录 前言1 试点项目:积累AI经验1.1 选择有实际价值的项目1.2 创新氛围的激发1.3 员工对新技术的接受度提升 2 建立高效的内部AI团队2.1 团队独立性与高层直报2.2 初期资金支持与资源整合 3 提供全面的AI培训计划3.1 针对不同层次的培训3.2 多样化培训形式3.3 内部人…

【Linux】线程同步与生产消费者问题

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:题目解析 🌎推荐文章:【LeetCode】winter vacation training 目录 👉🏻CP问题👉🏻互斥…

Linux:kubernetes(k8s)prestop事件的使用(10)

他的作用是在结束pod容器之后进行的操作 apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据,用于描述pod的数据name: nginx-po # pod名称labels: # pod的标签type: app #这个是随便写的 自定义的标签version: 1.0.0 #这个…

Day34-Linux网络管理4

Day34-Linux网络管理4 1. IP地址分类与子网划分基础1.1 什么是IP地址1.2 十进制与二进制的转换1.3 IP地址的分类1.4 私网地址和局域网地址 2. 通信类型3. 子网划分讲解3.1 为什么要划分子网?3.2 什么是子网划分?3.3 子网划分的作用?3.4 子网划…

【论文笔记】Language Models are Few-Shot Learners

Language Models are Few-Shot Learners 本部分是 GPT-3 技术报告的第一部分:论文正文、部分附录。 后续还有第二部分:GPT-3 的广泛影响、剩下的附录。 以及第三部分(自己感兴趣的):GPT-3 的数据集重叠性研究。 回顾…

算法学习09:堆

算法学习09:堆 文章目录 算法学习09:堆前言一、例题1:堆排序二、例题2:模拟堆总结 前言 提示:以下是本篇文章正文内容: 一、例题1:堆排序 堆排序:输入一个长度为n的整数数列&#x…

面了美团大模型算法工程师,这次侥幸通过了!

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 今天我介…

移动端uni-app小程序搜索高亮前端处理,同时可设置相关样式,兼顾性能

在uni-app中我们会遇到搜索高亮显示的需求 如下图: 起初用的是富文本实现 使用replaceAll方法取代搜索字段为一个 标签并设置相应的样式,但是小程序的并没有把 标签渲染出来,所以放弃了,下面原代码: /* 搜索字体变色…

算法(递归)黑盒思想

递归vs搜索vs回溯 递归的时候其实就是在搜索,递归返回的时候其实就是在回溯 常见的二叉树的题目基本都用到了递归: 求二叉树节点个数(后序遍历) int BinaryTreeSize(BTNode* root) {return root NULL ? 0 : BinaryTreeSize(roo…

HttpURLConnection详解及使用

HttpURLConnection 请求响应流程 设置连接参数的方法 setAllowUserInteractionsetDoInputsetDoOutputsetIfModifiedSincesetUseCachessetDefaultAllowUserInteractionsetDefaultUseCaches 发送URL请求 建立实际连接之后,就是发送请求,把请求参数传到…

深度学习500问——Chapter02:机器学习基础(5)

文章目录 前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 2.14 贝叶斯分类器 2.14.1 图解极大似然估计 极大似然估计的原理,用一张图片来说明,如下图所示: 例:有两个外形完全相同的箱子,1号箱…

使用Migration升级数据库

使用Migration升级数据库 package com.tiger.room2;import android.content.Context;import androidx.annotation.NonNull; import androidx.room.Database; import androidx.room.Room; import androidx.room.RoomDatabase; import androidx.room.migration.Migration; impo…

Linux系统下使用C++推流多路视频流

先看拉取的视频流效果: 代码如下: 一开始打算使用python写多路视频推流,但在ubuntu系统上搞了好久就是搞不定openh264导致的错误,然后改用c了,代码如下,我这里推了两路视频流,一路是网络摄像头&…