【C语言】字符串和内存函数介绍及模拟实现

1. C语言字符库函数

1.1 字符串长度计算函数——strlen

介绍

size_t strlen( const char *string );

字符串已 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
注意:

  1. 传入的字符串一定要包含\0,不然可能会出现结果错误。
  2. 返回值为size_t,为无符号整型。

针对第2点的一个易错题:

int main()
{
   
	const char* str1 = "wjhwef";
	const char* str2 = "abc";
	if (strlen(str2) - strlen(str1) > 0)
	{
   
		printf("str2>str1\n");
	}
	else
	{
   
		printf("srt1>str2\n");
	}
	return 0;
}

大家可能会这么想,strlen(str2) = 3 , strlen(str1) = 6strlen(str2) - strlen(str1) = -3 < 0,程序输出str1 > str2,那我们来看看究竟是不是这样!
运行结果:

str2>str1

C:\Users\HP\Desktop\gitee\test\world\7-06-字符串函数\x64\Debug\7-06-字符串函数.exe (进程 20212)已退出,代码为 0。
按任意键关闭此窗口. . .

结果不对,程序输出的结果是str2>str1,这是因为函数strlen返回的类型是无符号整型,两个无符号整型进行加减运算还是无符号整型,而无符号整型的范围是大于0的,所以程序会输出str2>str1

模拟实现

这个函数模拟很简单,根据\0为结束标志,计算字符个数即可。

这里有三种实现方式:

  1. 计数实现
  2. 递归实现
  3. 指针 - 指针实现
//计数实现
size_t my_strlen1(const char* string)
{
   
	size_t count = 0;
	while (*string++ != '\0')
	{
   
		count++;
	}
	return count;
}
//递归实现
size_t my_strlen2(const char* string)
{
   
	if (*string == '\0')
	{
   
		return 0;
	}
	else
	{
   
		return 1 + my_strlen2(string + 1);
	}
}
//指针-指针实现
size_t my_strlen3(const char* string)
{
   
	char* tmp = string;
	while (*tmp != '\0')
	{
   
		tmp++;
	}
	return tmp - string;
}
int main()
{
   
	char arr[] = "abcdefghijk";

	printf("%u\n", my_strlen1(arr));
	printf("%u\n", my_strlen2(arr));
	printf("%u\n", my_strlen3(arr));
}
//打印结果:11

1.2 字符串拷贝函数——strcpy,strncpy

介绍

char *strcpy( char *strDestination, const char *strSource );
char *strncpy( char *strDest, const char *strSource, size_t count );

这两个函数都能实现字符串的拷贝,只不过strncpy多了一个参数count,用来控制拷贝字符串的个数,count是多少字符串就拷贝多少,当然如果超过了源字符串的个数就会在源字符串拷贝完后直接补0直到数量为count个。
这两个函数都有两个字符指针,前者是是拷贝存放的地方(目标字符串),后者是需要被拷贝的字符串(源字符串)。
注意:

  1. 源字符串必须含有\0
  2. 源字符串中的\0会被拷贝到目标字符串。
  3. 目标字符串空间要够大或可变。
int main()
{
   
	char str1[] = "Hello World!";
	char str2[100] = {
    0 };
	char str3[100] = {
    0 };
	strcpy(str2, str1);
	strncpy(str3, str1, 5);
	printf("%s\n", str2);
	printf("%s\n", str3);
	return 0;
}

Hello World!
Hello

C:\Users\HP\Desktop\gitee\test\world\7-3-字符串函数\x64\Debug\7-3-字符串函数.exe (进程 14244)已退出,代码为 0。
按任意键关闭此窗口. . .

模拟实现

strcpy模拟实现思路:
利用结束标志\0,对源字符串遍历,遍历一个就拷贝一个到目标字符串,直到遇到\0,结束遍历,拷贝完成!
strncpy模拟实现思路:
如果count的值不大于源字符串的字符个数(包括\0),则和strcpy拷贝思路是一样的,但是count大于源字符串个数,源字符串中字符拷贝完后,还得在目标字符串补0

char* my_strcpy(char* des, const char* str)
{
   
	assert(des && str);
	char* ret = des;
	while (*des++ = *str++)
	{
   
		;
	}
	return ret;
}
char* my_strncpy(char* des, const char* str, size_t n)
{
   
	assert(des && str);
	char* ret = des;
	while(n--)
	{
   
        //源字符串未到结尾
		if (*str)
		
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morning_Yang丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值