文章目录
字符函数
在C语言中字符函数主要分为两类,分别为字符分类函数和字符转换函数
字符分类函数
C语⾔中有⼀系列的库函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的,
这些函数的使用都需要包含一个头文件 ctype.h
iscntrl();//判断是否是控制字符
isalnum();//判断是否是字母或者数字
isspace();//判断是否是空白字符,例如空格,换行符,制表符等
isalpha();//判断是否是字母
isdigit();//判断是否是十进制数字
islower();//判断是否是小写字母
isupper();//判断是否是大写字母
ispunct();//判断是否是标点符号,不属于数字或字母且可打印
isgraph();//判断是否是图形符号
isprint();//判断是否是可打印字符
以上库函数在判断条件为真时返回1,否则返回0
字符转换函数
int tolower(int i);//将参数从大写字母转换为小写字母
int toupper(int i);//将参数从小写字母转换为大写字母
下面结合字符分类函数举一个例子:
#include <ctype.h>
#include <stdio.h>
int main()
{
char arr[20] = { "abcDEFghI" };
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for (i = 0; i < sz; i++)
{
//判断arr[i]是否是大写字母,如果是则将其转换为小写字母
if (isupper(arr[i]))
{
arr[i] = tolower(arr[i]);
}
}
printf("%s\n", arr);
return 0;
}
函数输出结果:
字符串函数
下面介绍一些用于操作字符串的库函数
strlen的使用及模拟实现
size_t strlen(const char* str);//返回参数str中的字符个数
注意
1 strlen函数统计的是字符串中’\0’之前的字符个数,不包括’\0’
2 函数返回的是size_t类型,是一个无符号的整数类型
3 使用时需要包含头文件 string.h
strlen的简单使用举例
#include <stdio.h>
#include <string.h>
int main()
{
char arr[20] = "abcd\0efg";
printf("%zd\n", strlen(arr));//注意打印的是\0之前的字符个数
return 0;
}
打印结果如下:
strlen的模拟实现
strlen函数的模拟实现有多种方法,这里介绍一种使用递归模拟的方法
//递归模拟strlen
size_t my_strlen(const char* str)
{
assert(str);//判断字符串是否为空
if (*str == '\0')
return 0;
else
return my_strlen(str + 1) + 1;
}
strcpy的介绍及模拟实现
strcpy的介绍
strcpy函数的作用是内容复制,即将一个字符串的内容复制到另外一个数组中
strcpy函数的基本形式如下:
char* strcpy(char* dest,const char* src)//dest指的是目标地址,src指的是需要复制的内容的地址
注意
1 该函数会将原字符串中的’\0’也拷贝过去
2 目标空间需要足够大
3 返回的是dest的起始地址
strcpy的模拟实现
了解了strcpy函数的基本形式,我们来尝试模拟实现:
//模拟实现strcpy
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);//确保两处地址不为空
char* ret = dest;//因为dest将会被改变,所以需要先记录
//这种写法会将'\0'也拷贝过去
while (*dest++ = *src++)
;
return ret;
}
int main()
{
char* src = "abcde";
char dest[20] = "xxxxxxxxxxxxxxxx";
printf("%s\n", my_strcpy(dest, src));
return 0;
}
测试结果如下:
strcat的介绍及模拟实现
strcat 的介绍
strcat是字符串追加函数,作用是将一个字符串追加到另一个字符串后面,其基本形式与strcpy类似
char* strcpy(char* dest,const char* src)//dest指的是目标地址,src指的是需要被追加的内容的地址
注意事项与strcpy类似
strcat的模拟实现
//模拟实现strcat
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);//确保两处地址不为空
char* ret = dest;//因为dest将会被改变,所以需要先记录
//为了追加我们首先要找到dest这个数组的'\0'的位置,然后再追加
while (*dest != '\0')
dest++;
//这种写法会将'\0'也拷贝过去
while (*dest++ = *src++)
;
return ret;
}
int main()
{
char* src = "abcde";
char dest[20] = "xxxxxxxx";
printf("%s\n", my_strcpy(dest, src));
return 0;
}
追加结果如下:
strcmp的介绍及模拟实现
strcmp的介绍
strcmp是字符串比较函数,字符串是不能比较大小的,需要对两个字符串中对应位置的字符一个一个比较大小,当遇到不相同的字符时,大于返回一个大于0的数,小于返回一个小于0的数,等于则返回0
strcmp的模拟实现
//模拟实现strcmp
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
//首先需要找到第一个不相等的字符
while (*str1 == *str2 && *str1)
{
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char* str1 = "abcde";
char str2[20] = "abce";
if (my_strcmp(str1, str2) > 0)
printf("str1 > str2");
else if (my_strcmp(str1, str2) == 0)
printf("str1 == str2");
else
printf("str1 < str2");
return 0;
}
打印结果如下:
strncpy,strncat,strncmp函数对比介绍
对于strcpy,strcat以及strcmp这三个函数而言,是不能够指定操作个数的,即无法指定拷贝,追加或者对比几个字符,所以C语言中还有另外三个函数strncpy,strncat以及strncmp,其基本形式如下
char* strncpy(char* dest,const char* src,size_t num);//这里的num指的就是需要拷贝的字符个数
char* strncat(char* dest,const char* src,size_t num);//这里的num指的就是需要追加的字符个数
char* strncat(char* dest,const char* src,size_t num);//这里的num指的就是需要比较的字符个数
这三个函数的模拟实现与前面介绍的三个基本函数的模拟实现类似,这里不再过多介绍
注意
1 对于strncpy,如果src的个数不够num个,则在全部拷贝完后补0,直到补够num个字符
2 对于strncat,如果src的个数不够num个,则只会追加到src中的\0为止
strstr的介绍及模拟实现
strstr的介绍
strstr是字符串查找函数,即在一个字符串中查找另外一个字符串,并且返回被查找字符串在目标字符串中第一次出现的起始位置的地址,其基本形式如下:
char* strstr(const char* str1,const char* str2);//在str1中查找str2
strstr的模拟实现
//模拟实现strstr
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);//首先确保字符串不为空
char* s1 = (char*)str1;
char* s2 = NULL;
char* tmp = NULL;
//如果str2中为空字符,返回NULL
if (!*str2)
return NULL;
//s1从起始位置慢慢后移
while (*s1)
{
tmp = s1;
s2 = (char*)str2;
//如果找到一个位置*tmp与*s2相等则从这个位置往后一个一个对比
while (*tmp == *s2 && *s2)
{
tmp++;
s2++;
}
//如果*s2为\0,说明找到了相等的字符串,返回这个字符串的起始位置
if (!*s2)
return s1;
s1++;
}
//函数走到这说明找完了都没有找到相等的字符串,返回NULL
return NULL;
}
int main()
{
char* str1 = "abcdefg";
char* str2 = "def";
printf("%s\n", my_strstr(str1, str2));
return 0;
}
结果打印如下: