【c语言】strlen()和strcpy()的超详细介绍

在c语言的编写中,我们常会运用到字符和字符串类型,相关的字符串函数知识也是必不可少的,接下来我将介绍下字符串函数中strlen和strcpy。

strlen的介绍:

strlen是用来计算字符串长度的函数,从字符串的起始地址出发,一直到字符串中的“\0”停止,但最终计数是不包括“\0”的,返回类型为

size_t strlen ( const char * str );

传入的参数为字符串首字母的地址

返回值为 size_t 无符号整型,即unsigned int

strlen的使用介绍:

要使用strlen() 就要包含头文件<string.h>

#include<stdio.h>
#include<string.h>


int main()
{
	char arr[] = "abcdefg";
	int tmp = strlen(arr);
	printf("%d", tmp);
	return 0;

}

输出结果: 

值得注意的是,strlen()将会一直往后数,直到遇到"\0"才会停止,所以当你使用strlen来求字符数组时,必须要在数组最后添加元素"\0"

#include<stdio.h>
#include<string.h>


int main()
{
	char arr1[] = {'a','b','c','d','\0'};
	int tmp = strlen(arr1);
	printf("%d", tmp);
	return 0;

}

运行结果为:

关于strlen()的模拟实现

法一,直接计数
int my_strlen(const char* arr)
{
	assert(arr != NULL);
	int count = 0;
	while (*arr != '\0')
	{
		count++;
		arr++;
	}
	return count;
}

可以模拟实现strlen()的功能

其中assert是为了判断传入的指针是否为空指针。

法二,递归法

每次递归让arr所指的地址+1,直到'\0'的地址返回0

int my_strlen(const char* arr)
{
    assert(arr != NULL)
	if (*arr != '\0')
		return 1 + my_strlen(arr + 1);
	else
		return 0;
}
法三,指针减指针法

两个指针相减,所得的结果为两个指针之间的元素个数

因此我们可以先找到字符串首字母的地址、'\0'的地址,再将两个指针相减,即为字符串的长度

int my_strlen(const char* arr)
{
	assert(arr != NULL);
	char* p = arr;
	while (arr != '\0')
	{
		arr++;
	}
	return p - arr;
}

strcpy()的介绍:

传入参数 

char * strcpy ( char * destination, const char * source );

char* destination ------ 你黏贴的地址

const char* source -------- 你复制的地址

使用注意事项:

1.原字符串必须包含"\0",且“\0”也会被复制到你的粘贴处

2.粘贴处的空间必须足够大,能放得下复制的内容

3.粘贴处必须可修改

strcpy()的使用介绍

使用示例1:

int main()
{
	char arr1[] = "abcdefg";
	char arr2[20] = { 0 };  //初始化数组大小为20是为了有足够的空间放下拷贝的字符串
	strcpy(arr2, arr1);
	printf("%s", arr2);
	return 0;
}

运行结果:

从监视窗口可以看到,strcpy()将 arr1[ ] 的 “ \0 ” 之前的字符串都拷贝到 arr[ ] 中,包含" \0 "本身

 使用示例2:

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = {'a','b','c','d','\0'}; \\注意必须要有\0
	char arr2[20] = { 0 };
	strcpy(arr2, arr1);
	printf("%s", arr2);
	return 0;
}

运行结果:

示例介绍3:

#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[] = "abcdefg";
	char * p = "xxxxxxxx";
	strcpy(arr2, arr1);
	printf("%s", arr2);
	return 0;
}

以上程序将无法运行,因为strcpy()要求粘贴处必须为可修改的空间,但 p 是常量字符串,无法被修改,出现错误。

关于strcpy()的模拟实现

初阶

简单遍历原字符串,一个个拷贝到目标空间

void my_strcpy(char* dest, char* src)
{
	//拷贝\0前的字符
	while(*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	//拷贝字符\0
	*dest = *src;
}
高阶

在初阶的基础上作了两处更改

1.循环条件的改变,赋值表达式的返回值就是所赋的值,\0的值就是0,所以当 *src 移动到 '\0' 时的返回值就是0,此时循环条件为假,while循环终止。

2.my_strcpy()返回值的改变,由void变成了char*,试想,当你使用strcpy时,你把对象复制到目标空间,这时你接下来应该是想对目标空间进行操作,那你希望这时char* dest改变吗?那肯定是不希望的,所以就先将dest储存起来再返回。

char*  my_strcpy(char* dest, char* src)
{
	char* ret = dest;
	assert(dest);
	assert(src);
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}

以上就是本篇文章的全部内容了,如果对你有帮助,可以点个赞吗

你的支持是我写作的最大动力!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值