strcpy&&strcat运用+模拟实现

举报
芒果_Mango 发表于 2022/02/26 21:38:47 2022/02/26
【摘要】 模拟实现strcpy注意点:源字符串不修改,所以用const修饰,返回类型为char*,返回的是目标空间的起始地址,所以定义一个指针保存起始地址,然后将src指向的内容拷贝到dest中char* my_strcpy(char* dest,const char* src){ assert(dest&&src); char* ret = dest; //保存起始地址 whil...

模拟实现strcpy

注意点:源字符串不修改,所以用const修饰,返回类型为char*,返回的是目标空间的起始地址,所以定义一个指针保存起始地址,然后将src指向的内容拷贝到dest中


char* my_strcpy(char* dest,const char* src)
{
    assert(dest&&src);
    char* ret = dest;	//保存起始地址
    while(*src)
    {
        *dest = *src;
        dest++;
        src++;       
    }
    //上述只是完成了将src中\0之前的内容拷贝
    //还要拷贝\0
    *dest = *src;
    return ret;
}
int main()
{
    char arr1[] = "xxxxxxx";
    char arr2[] = "Mango";
    char* ret = my_strcpy(arr1,arr2);
    printf("%s\n",arr1);
    printf("%s\n",ret);
    return 0;
}

优化:

由于是后置++,所以先使用dest和src,,然后再自增指向下一个位置,相当于 *src++ <==>(*src)++

char* my_strcpy(char* dest,const char* src)
{
    assert(dest&&src);
    char* ret = dest;	//保存起始地址
    while(*src)
    {
        *dest++ = *src++;  
    }
    //上述只是完成了将src中\0之前的内容拷贝
    //还要拷贝\0
    *dest = *src;
    return ret;
}

再优化:

char* my_strcpy(char* dest,const char* src)
{
    assert(dest&&src);
    char* ret = dest;	//保存起始地址
    while(*dest++ = *src++)
    {
        ;
    }
    return ret;
}

最后一次,src指向\0,把\0也拷贝过去之后,while判断表达式为假,跳出循环。


strcat - 字符串(连接)追加函数

image.png

,从目标空间的\0位置开始向后追加源字符串


  • 源字符串必须以\0结尾
  • 目标空间也必须足够大,能容纳下源字符串的内容
  • 目标空间必须可修改
  • 不可以给自己追加!

int main()
{
	char arr1[] = "Mango";
	char arr2[20] = "Lemon";
	strcat(arr2, arr1);
	printf("%s\n", arr2);
}

打印结果:LemonMango


int main()
{
	char arr1[] = { 'a','b','c','\0' };
   // char arr1[] = { 'a','b','c' };	//err,没有放\0
	char arr2[20] = "Lemon";
	strcat(arr2, arr1);
	printf("%s\n", arr2);
}

打印结果:Lemonabc

因为arr1中放入了\0,所以可以


模拟实现strcat

思路:由于是在目标空间的\0位置开始向后追加,所以要先找到目标空间的\0位置,追加类似于strcpy过程,一个字符一个字符的追加,直到遇到源字符串的\0

注意:返回的是目标空间的起始地址,所以用指针变量保存它的地址。源字符串不修改,所以用const修饰


char* my_strcat(char* dest,const char* src)
{
    assert(dest && src);
	char* ret = dest;
	//1.找到目标空间的\0位置
	while (*dest)
	{
		dest++;
	}
	//跳出循环时,dest指向的就是目标空间的\0位置,从该位置向后追加,相当于strcpy
    //src的\0也拷贝过去了
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "Mango";
	char arr2[] = "Hello";
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。