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

       在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,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.hqwc.cn/news/526548.html

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

相关文章

扩展CArray类,增加Contain函数

CArray不包含查找类的函数,使用不便。考虑扩展CArray类,增加Contain函数,通过回调函数暴露数组元素的比较方法,由外部定义。该方法相对重载数组元素的“”符号更加灵活,可以根据需要配置不同的回调函数进行比较 //类型…

分布式架构之Nacos配置中心

一、配置中心的意义 1、微服务中配置文件的问题 配置文件的问题: 配置文件的数量会随着服务的增加持续递增单个配置文件无法区分多个运行环境配置文件内容无法动态更新,需要重启服务 引入配置文件:刚才架构就会成为这样。是由配置中心统一…

惬意上手MySQL

大家好,我又来写博客了,今天给大家介绍一下MySQL,如果你只想让MySQL作为自己的辅助开发工具,那这一篇文章就够了,如果想作为一门语言来学习,那你可以看此文章了解一些基础。 MySQL介绍 数据库可分为关系型数据库和非关…

【NR 定位】3GPP NR Positioning 5G定位标准解读(七)- GNSS定位方法

前言 3GPP NR Positioning 5G定位标准:3GPP TS 38.305 V18 3GPP 标准网址:Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读(一)-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读(…

分布式解决方案

目录 1. 分布式ID1-1. 传统方案1-2. 分布式ID特点1-3. 实现方案1-4. 开源组件 1. 分布式ID 1-1. 传统方案 时间戳UUID 1-2. 分布式ID特点 全局唯一高并发高可用 1-3. 实现方案 方案总结: 号段模式 有两台服务器,给第一台服务器分配0-100&#xff0…

【重要公告】BSV区块链上线TypeScript SDK,未来将支持更多开发语言

​​发表时间:2024年2月21日 BSV区块链协会宣布上线JavaScript和TypeScript SDK(即“标准开发工具包”)。TypeScript SDK旨在为开发者提供新版统一核心代码库,以便利开发者在BSV区块链上开发能够任意扩容的应用程序。新上线的SDK替…

R语言更新版本

目录 一、更新R语言 1、安装最新的R语言版本 2、移动之前安装的packages 3、将Rstudio连接到最新的R语言 二、Rstudio更新 一、更新R语言 1、安装最新的R语言版本 查看当前R语言版本: R.version.string 下载最新的R语言安装包:R: The R Project…

前端框架的发展历程

文章目录 前言 一、静态页面时代 二、JavaScript的兴起 三、jQuery的出现 四、前端框架的崛起 1.AngularJS 2.React 3.Vue.js 五、面向组件化的发展趋势 总结 前言 前端框架的发展史就是一个不断进化的过程,它的发展和进化一定程度…

16 PyTorch 神经网络基础【李沐动手学深度学习v2】

1. 模型构造 在构造自定义块之前,我们先回顾一下多层感知机的代码。 下面的代码生成一个网络,其中包含一个具有256个单元和ReLU激活函数的全连接隐藏层, 然后是一个具有10个隐藏单元且不带激活函数的全连接输出层。 层和块 构造单层神经网咯…

【网络应用层协议】【MQTT】详解消息队列遥测传输协议MQTT(超详细)

目录 1. MQTT 协议简介 2. MQTT 的特点 3. MQTT 协议原理 4. MQTT协议中的订阅、主题、会话 1. MQTT 协议简介 MQTT( Message Queuing Telemetry Transport,消息队列遥测传输协议 )是一种消息列队传输协议,采用订阅、发布机制&…

面向对象(精髓)变继承关系为组和关系

在面向对象编程中,继承关系是一种重要的关系类型,它允许一个类(子类)继承另一个类(父类)的属性和方法。然而,随着软件系统的复杂性不断增加,传统的继承关系可能会导致代码的臃肿和耦…

【国产MCU】-CH32V307-SysTick中断与延时功能实现

SysTick中断与延时功能实现 文章目录 SysTick中断与延时功能实现1、SysTick介绍2、SysTick中断使用3、SysTick实现微秒和毫秒延时功能CH32V307的RISC-V内核控制器自带的一个64位可选递增或递减的计数器,用于产生SYSTICK异常(异常号:15),可专用于实时操作系统,为系统提供“…