字符函数和字符串函数
前言?
字符分类函数?
这些字符分类函数都是类似的,返回值都是int,假如我们用islower,如果参数是小写字母,则返回非0的随机数,如果不是则返回0.
参数类型也要是int,但我们输入的不仅可以为整数(字符的ascall码值),也可以是单个字符(因为其类型差距过小,所以系统直接帮其隐式转换)。
这些字符分类函数如下
?不要求强记, 知道几个很简单的就行,islower,isupper。其他的到时候要用到的话再回来看下就行。
其头文件都为#include<ctype.h>,这个为新学的头文件 。
字符转换函数
大写字母的ascall码值比小写字母小32,所以小写字母转换为大写只需要减32就行。(存在隐式转换)?
而我们也可以直接用函数去直接转换?
头文件都为#include<ctype.h>,返回值为ascall码,参数也为ascall码,不过不重要,依然可以参数为字符(有隐式转换)。?
getchar和putchar?
getchar?
int getchar(void) 所以是getchar(),其作用原理是接收缓冲区的单个字符,并返回字符的ascall码值。
如果缓冲区没有字符,则我们要自己输入数字。
如果缓冲区有剩余的字符,则直接用它,不用自己输入。
我们还要知道在我们输入值时,我们键盘中的enter键在输入后会使我们的缓冲区多个\n。而空格键在输入后同样代表着使缓冲区多个空格字符。至于缓冲区\n和空格字符,并不是所有函数全都不能识别。有些函数能识别,有些函数不能识别,遇到它就会终止。依据函数而定。这方面的知识说实话有点抽象。所以依据这上述知识在面对一些问题时就会出现bug。
就是因为在输入完abcdef之后来了个enter键,这下缓冲区又多了个\n,而scanf不能识别\n,所以
会多个 \n,而getchar由于多出来个\n,就直接接收\n,不用自己输入,从而ch是\n,导致还没输入就出结果,所以需要两个getchar,且在enter完之后就输入字符,(不能再输入空格,其也会被识别,会导致结果错误)
putchar?
putchar的使用是直接putchar(),括号中为字符的ascall码形式或者字符形式(因为会隐式转换,所以哪种都行,不要纠结其putchar参数为哪种类型它接收就必须该种类型,因为隐式转换导致不只是必须为该类型)
作用就是直接以字符形式打印出来,打印出字符形式。返回值为其字符的ascall码值(int)。
这个相比于getchar简单了些,因为getchar涉及了缓冲区,其更为复杂。
对于getchar和putcha这篇文章有更详细的解释?
?https://blog.csdn.net/2201_75743654/article/details/131829012
两者头文件
?都为#include<stdio.h>
strlen函数?
strlen我们之前就学过,这里就不详细讲,对于其模拟有三个方式,第三个方式是不创建临时变量的方式,用了函数递归去实现。
头文件为#include?<string.h>?
从接收的地址里的内容如果等于\0,则结束,如果不是,则将指针+1,直到等于\0,返回值为测出\0前面的个数(不算上\0自己)。?
?
?其中这里值得讲的一个是其返回值为size_t,其为无符号整数,有个易错的地方,如下
因为3,6为无符号整数,从而相减得出-3其也为无符号整数,-3转化为无符号整数就为 2的32次方加3,从而为正,输出大于。?
不是我们想当然的输出小于。
strcpy函数?
?
?strcpy是将source的那部分直接拷贝到destination那,其中参数类型如上。
其中需要注意的一点是source中拷贝是指向的内容遇到\0再终止,包括\0一起移动到目标地。
还需注意左边的目标参数类型为char*,右边源头参数类型为const char* 。?
其返回值为destination的原本的首位地址。
?模拟strcpy函数没什么好讲的
?只需要注意其两个为后置++,在赋值完后才执行。所以才能这么写。
头文件为 #include<string.h>
0的一些区别认知
?第四个nul,NUL代表着\0.
其他没什么好说的。
?strcat函数
没什么必须要讲的,其函数格式跟strcpy格式一摸一样?
strcat跟strcpy有点类似,只不过该函数是从目标函数的第一个\0时开始作用链接。而strcpy是最开始就作用。就多了一个这个。
而还要额外说一个点,能否自己链接自己。如果按照我们模拟的代码来说,其会造成死循环而后越界访问。
但是strcat库函数代码实现方式肯定跟我们不一样,更高级,其可以实现自己连接自己?。但我们还是建议即使它能实现,还是不要用strcat库函数去实现自己连接自己,风险还是有点高。
返回值为目标首个元素地址,跟strcpy一样?
头文件#include<string.h>
strcmp函数
在之前就有讲到strcmp函数 ,在这篇文章中
https://blog.csdn.net/Easonmax/article/details/134718250?spm=1001.2014.3001.5501
这里就不讲了?
上面是该函数的模拟实现。
长度限制函数
前文?
由于前面三个函数 strcat strcpy? strcmp 没有长度限制而直接运行,vs编译器认为不安全,在没有?
?的情况下会直接报错,不让运行。
例子如下
?
所以我们就多了这三个函数,有长度限制的函数,vs认为其很安全。?
?
strncpy?
?strncpy 如果num小于字符串长度,则直接取出其对应的字符 (后面不带\0),对应什么就拿什么。 如果超过其字符串长度,超过的部分都为\0。
这是其细节部分。?
这里还要说一点,一个程序员非要找bug的话你是拦不住他的,不要故意制造一些bug。比如将9个的字符串复制到5个空间大的目标处。这是故意找bug
?strncat
?strncat当num小于字符串长度时,其会将本来的字符部分外加\0追加到末尾。而strncpy当小于字符串长度时,不会主动添加\0。?
当num大于字符串长度时,其只会将整个字符串追加到目标处(包括\0,只有一个) 。而strmcpy当大于时会将超过的部分都变为\0(会有多个\0)。
?这就是其strncat更多细节
对于自己给自己追加,我们就可以用strncat实现,长度为字符串长度。不要用strcat实现自己给自己追加。(有长度限制,相比另一个更安全)
制造一些bug,一个程序员想制造bug是拦不住的?。
strncmp?
?
这个没什么较多细节,就是对比较的长度进行限制。
当然不要故意制造bug,使比较长度大于本身字符串长度?。
头文件?
头文件都为? #include<string.h>
其三个函数模拟实现就不说了。
?strstr
?
?strstr会返回 str2在str1的第一次地址 ,前提要str1中有str2(不包含\0)。如果没有,则返回NULL.
str2如果为空字符串(空字符串为“”,里面只有一个\0),则strstr返回str1字符串的首位元素地址。c语言规定的。
所以模拟实现为上述代码。
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!