strcpy&&strcat运用+模拟实现
【摘要】 模拟实现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 - 字符串(连接)追加函数
,从目标空间的\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)