在编程的过程中,我们经常要处理字符和字符串,为了⽅便操作字符和字符串,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。相当于告诉我们有什么错误,错误是什么。
这里的错误我就不给大家翻译了,大家如果感兴趣的话,可以自己去翻译一下。
那么这些是鄙人今天想与大家分享的知识点了,当然还有一些知识点是没有写出来的,希望大家可以在评论区写出来,方便鄙人改正。