C语言字符函数和字符串函数

本文详细介绍了C语言中的字符分类函数(如isalnum,islower等)、字符转换函数(tolower,toupper),以及strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp和strstr等字符串操作函数的使用、模拟实现和注意事项。
摘要由CSDN通过智能技术生成

字符函数

在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;
}

结果打印如下:
在这里插入图片描述

  • 21
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值