1.字符分类函数
(1)在c语言中存在一系列函数是专门用来做字符分类的,也就是一个字符是属于什么类型字符的。
(2)所有的这一类函数都需要引用同一个头文件<ctype.h>。
(3)以下就是这些函数的函数名及其作用:
(4)选取其中是islower举例:其形式为int islower( int c );其中的 int c 是字符或者字符的ASCII码值。
可以用这样的语句进行实现int ret=slower=('a'): printf("%d ",ret);实现函数结果的检验,容易发现如果括号里面的值符合,那么ret就为非零的数,其他的情况则ret则会变成0;
再用上面的函数举一个具体例子:(把一个字符串的小写字母全部变成大写)
同理以上其他所有函数都是这样的;
2.字符转换函数
(1)作用很简单就是对大写与小写字母进行呼唤,分为两个一个函数名叫做tolower,而另一个叫做toupper
(2)所需要包含的头文件依然是<ctype.h>;
(3)形式分别为:int tolower (itn c);//将参数传进去的大写字母变成小写字母
int toupper (itn c);//将参数传进去的小写字母变成大写字母
(4)用以上知识可以对上一个图片中的例子进行改变:
3.长度不受限制的字符串函数
<1>.strlen函数
(1)函数的形式: size_t strlen( const char * str );
(2)字符串是以'\0'作为结束标志的,strlen函数返回值是在字符串中'\0'前面出现的字符个数(不包括'\0');
(3)注意参数指向的字符串必须要以'\0'来结束;
(4)头文件为<string.h>;
(5)返回值为size_t,是无符号的(易错);(无符号整型)
(6)使用递归的方法来模拟实现一下strlen函数的实现过程:
<2>.strcpy函数
(1)字符串拷贝函数,顾名思义作用就是拷贝字符串;
(2)函数原型: char * strcpy ( char * destination , char * source ) ;
strcpy函数的返回值是目标空间的起始地址;
作用是把source指向的字符串放在destination指向的空间中去,包含结束的 '\0' ;
(3)简单的举例一下:
运行后可以成功看到arr2中变成了hello world;
(4)注意:源头的字符串必须出现'\0',不然strcpy不会结束;
(5)用简单的代码实现strcpy的功能:
也可以重新改写一下:
<3>.strcat函数
字符串连接函数
(1)原型:char * strcat ( char * destination , const char * source);该函数的返回值同样是目标空间的首地址。
(2)简单举例:
(3)要点:目标字符串必须要有'\0',连接的字符串也要有'\0',否则没法结束(或者说不知道什么时候结束),目标空间必须足够大,目标空间必须可以被修改;
(4)编程实现strcat函数的功能:
(5)能否用strcat函数使字符串本身连接在自己后面呢,答案是不能(实践出真知,是一个死循环);
<4>.strcmp函数
字符串比较函数
(1)原型为:int strcmp ( const char * str1, const char * str2 );(注意不是比较字符串的长度,而是比较对应字符的大小。)
(2)如果str1>str2,那么返回值为小于零的数,如果大于则返回相同的数,再者返回0;
(3)简单举例:
(4)简单代码实现strcmp函数的功能:
4.长度受限制的字符串函数
<1>strncpy
(1).函数原型为:char *strncpy( const char *destination, const char * source, size_t num );
其中num所值的意思是从source中最多拷贝的字符。
(2)简单举例子:
按照上图中代码当然也会有比如把3改成7之类的,这样arr1里面内容就不够了,这时候拷贝过程中多出来不够的就会自动用'\0'来表示。
<2>strncat
(1)函数原型为char * strcat ( char * destination , const char * source ,size_t num );其中num所值的意思是从source中最多连接的字符。
(2)简单举例一下:
(3)可以总结一下strncat的特点:
从'\0'后面开始追加特定的个数的字符,然后在追加完之后再自动加上一个'\0'让其变成字符串,
再者就是如果source的字符串长度小于num的时候只会追加一个'\0'(不会和strncpy一样追加更多的'\0')。
(4)不同于strcat而言,这个函数可以自己给自己追加。
<3>strncmp
(1)原型为:int strcmp ( const char * str1, const char * str2 , size_t num );(num的意思是指的最多比较的字符的数量。)
(2)简单举例一下:
当有一个字符串不够长,且num还没使用完时,比较到'\0'就不再比较了。
5.其他几个函数
<1>strstr函数
使用场景:用来在一个字符串中有没有出现过另一个字符串。
(1)函数原型:char * strstr ( const char * str1 , const char * str2 );
(2)函数返回字符串str2在字符串str1中第一次出现的位置,如果找到则返回第一次的起始位置,如果找不到,就返回NULL空指针。
(3)字符串的比较匹配不包含'\0'字符,以'\0'作为结束标志。
(4)简单举例一下:
(5)代码模拟的思路比较复杂:具体可以参考学习strstr函数的代码模拟实现 · zyzyzy_mhmhmh/c语言学习 - 码云 - 开源中国。
也可以用其他的方法的代码来模拟实现这个函数:kmp算法(难度和深度比上面的链接中高)。
<2>strtok函数
使用场景:例如我有一个邮箱245466234@ww.com(乱写的),然后我只想要245466234 ww com这些内容,我就可以使用strtok函数来解决。
(1)函数原型:char * strtok ( char * str ,const char * sep );
(2)函数中的sep参数指向一个字符串,定义了用作分隔符的字符集合。(举例在245466234@ww.com中我就认为@和.是分隔符。);
(2)第一个参数指向一个字符串,这个字符串包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标志;
(3)strtok函数找到str中的下一个标记,并将其用'\0'结尾,然后把这个'\0'作为标记,并返回这个标记的指针。(strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可以被修改。)
意思就是:245466234@ww.com在这个字符串中我会找到@和.符号并将它们都变成'\0',变成245466234\0ww.com之后\0就作为一个标记。
(4)strtok函数的第一个参数不为空指针(NULL)时,strtok函数str中的第一个标记,strtok函数将保存它在字符串中的位置。
(5)strtok函数的第一个参数为空指针(NULL)时,函数将在同一个字符串中被保留的位置开始,寻找下一个标记。
意思就是:245466234\0ww.com在上次调用后有一个标记了,再调用一次时str位置用NULL,就会从\0从后开始寻找第二个标记了。
(6)如果字符串中不存在更多的标记,则返回空指针(NULL)。
意思就是:在最后一个标记后你再像上述一样调用这个strtok函数,则会返回空指针。
(7)根据上述描述后你会发现如果我不要知道要调用几次该怎么办呢,很明显要用到循环的方法,下面分享一个比较巧妙的方法:
这个代码巧妙运用了for循环和strtok函数的特点(再次调用时从上一次的标记开始,这种有记忆功能,猜测是不是函数里面有static修饰的变量呢?)。
<3>strerror函数
使用场景:strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回。(在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在<errno.h>这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码存放在errno中,而一个错误码是整数很难理解是什么意思,所以每一个错误码都是有对应信息的,strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回)。
(1)函数原型:char * strerror ( int errornum);
(2)简单举例:
如图中我故意把错误码设置成1-9然后呈现出来了它们对应的错误信息,这就是strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回,然后我再让它呈现出来。
(3)具体使用:
如果不存在date.txt这个文件那就无法打开,运行后就会告诉你原因为什么打开文件失败。
1.与strerror函数相关的函数perror函数
strerror函数是将错误码对应的错误信息的字符串的地址返回。
而perror函数是直接把errno中错误的对应信息打印出来。
perror函数先打印str指向的字符串,再打印:,然后再打印一个空格,然后再打印错误码对应的错误信息。
<1>函数原型:void perror( const char * str );
<2>举例如下:
基于上一张图片加入一行代码并运行这个代码后会发现,这两行代码打印出来的结果是完全相同的。
运行上述代码后会发现,perror的作用相当于printf加上strerror。
6.小结
以上就是一些常见的字符和字符串有关的函数,是对学习的一些总结。