C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的,这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h 如下图:
这些函数的使用方式十分类似,现在拿一个函数举例:
int islower ( int c );
islower 是能够判断参数部分的 c 是否是小写字母的,通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0 练习:写⼀个代码,将字符串中的小写字母转大写,其他字符不变,最后将其打印出来 分析:首先我们可以创建一个字符数组存放字符串,随后对数组遍历,每一次都使用函数islower函数判断一下该字符是否是小写字母,如果是小写字母,那就给它-32,让它变成对应的大写字母,最后我们以%s的形式将数组打印出来即可(记得包含头文件ctype.h) 代码如下:
#include <stdio.h>
#include <ctype.h>
int main()
{
char arr[] = "Hello World!";
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz-1; i++)
{
if (islower(arr[i]))
{
arr[i] -= 32;
}
}
printf("%s\n", arr);
return 0;
}
运行结果:
C语言提供了两个字符转换函数,要使用它们同样要包含头文件ctype.h:
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
于是我们之前的那个将小写字母转换为大写字母的练习就可以这样写:
#include <stdio.h>
#include <ctype.h>
int main()
{
char arr[] = "Hello World!";
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < sz-1; i++)
{
if (islower(arr[i]))
{
toupper(arr[i]);
}
}
printf("%s\n", arr);
return 0;
}
首先我们来看看strlen的原型:
size_t strlen ( const char * str );
strlen的特点:
当我们知道strlen的原理后我们就试着来模拟实现一下我们自己的strlen:
size_t my_strlen(const char* p)
#include <assert.h>
size_t my_strlen(const char* p)
{
assert(p);
const char* start = p;
while (*p)
{
p++;
}
return p - start;
}
函数strcpy的作用是拷贝字符串,比如我们要把一个数组中的字符串拷贝到另一个数组中,我们就会使用strcpy函数,使用它需要包含头文件string.h,接下来我们来看看函数strcpy的原型:
char* strcpy(char * destination, const char * source );
原型解析:strcpy的第一个参数是我们拷贝字符串的目的地的首地址,也就是接收拷贝的数组的首元素地址,第二个参数是我们拷贝字符串的源字符串的首地址,它的返回值就是接收拷贝的目标空间的初始地址 了解了它的原型,我们现在来看看它的特点:
现在我们来使用一下它,把数组arr2的字符串拷贝到arr1当中,如图:
可以看到strcpy帮我们把数组arr2的字符串拷贝给了arr1 学会使用,以及了解了它的使用方法之后,我们来试着模拟实现一下strcpy:
char* my_strcpy(char* str1, const char* str2)
while (*str1 = *str2)
{
str1++;
str2++;
}
(4)我们可以优化一下上面的代码,既然str1和str2都要++的,我们可以直接写到循环条件里去,如下:
while (*str1++ = *str2++)
{
;
}
这样比较简洁 (5)最后实现拷贝后,我们就可以返回start了
#include <assert.h>
char* my_strcpy(char* str1, const char* str2)
{
assert(str1 && str2);
char* start = str1;
while (*str1++ = *str2++)
{
;
}
return start;
}
函数strcat的作用是追加字符串,把一个字符串追加到指定字符串的末尾,使用它要包含头文件string.h,接下来我们来看看strcat的原型
char * strcat ( char * destination, const char * source );
strcat函数原型:它的参数和strcpy类似,第一个参数是被追加的目的地的首地址,第二个参数是要追加的源数据的首地址,返回的也是被追加的目的地的首地址 了解了它的原型后,我们来看看它的特点:
了解strcat的特点后,我们来试着使用它,把字符串数组arr2的字符串追加到字符串数组arr1后:
随后我们来试试模拟实现一下strcat:
char* my_strcat(char* str1, const char* str2)
while (*str1)
{
str1++;
}
(4)注意这里不能把循环条件写成str1++,因为如果str是\0了,循环是照常结束,但是str还要++一次,str就指向\0后面了,根据我们前面的分析就是错误的,所以这里只能把str自增的语句写在循环体内,当然,如果是拷贝字符串则不用担心这一点,可以放心把自增写在循环判断条件中 (5)然后我们继续分析,经过上面的循环,我们的str1指向的就是\0了,接着我们就把str2字符串完整的拷贝过来就可以了,这个拷贝的过程可以参考strcpy,可以把自增条件写在循环判断条件中,如下:
while (*str1++ = *str2++)
{
;
}
#include <assert.h>
char* my_strcat(char* str1, const char* str2)
{
assert(str1 && str2);
char* start = str1;
while (*str1)
{
str1++;
}
while (*str1++ = *str2++)
{
;
}
return start;
}
最后我们思考一下,一个字符串能不能使用strcat自己给自己追加?如图:
很明显失败了,这是为什么呢?原因在下一篇字符函数和字符串函数(2)中我们会讲到,要实现这个功能需要另一个函数strncat,到时候也会详细介绍以及实现这个函数,期待一下吧!
strcmp的作用就是帮我们比较两个字符串的大小,那么比较的依据是什么呢?是字符的acsll码值,同样的,使用该函数要包含头文件string.h,我们来看看它的原型:
int strcmp ( const char * str1, const char * str2 );
原型解析:strcmp的两个参数分别是两个字符串的首字符地址,如果前一个字符串大于后一个字符串,返回一个大于0的数,如果相等就返回0,如果小于就返回一个小于0的数 接着我们来看看strcmp的特点:
了解了这些之后,我们来尝试使用一下strcmp函数来比较两个字符串,技巧就是用一个变量接收strcmp的返回值,然后根据返回值来确定两个字符串的大小关系,如下:
现在我们来模拟实现一下strcmp:
int my_strcmp ( const char* str1, const char* str2 );
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
这次的字符函数和字符串函数(1)就介绍到这里,更多的相关函数请期待下文! 感谢阅读!