首页 > 其他分享 >strcpy

strcpy

时间:2023-10-03 22:45:49浏览次数:43  
标签:dest char ++ strcpy sou my

一、实现

我们先看函数传递的参数,是两个指针,一个是strSource(字符串的源头),另一个是strDestination(字符串的目的地),因此,我们也需要传递两个指向字符串地址的指针。

而我们知道库里的strcpy函数会传递源头字符串末尾的'\0',因此我么可以这样来写代码。

代码如下:

include<stdio.h>

void my_strcpy(char* dest, char* sou)
{
while (sou != '\0')
{
dest = sou;
dest++;
sou++;
}
}
int main()
{
char arr1[] = "Hello World!";
char arr2[] = "
************";

my_strcpy(arr2, arr1);

return 0;

}
这种写法只能模拟基本功能,如果满分为10分,上述代码只能得5分,还有很多的优化空间。

二、优化
我们根据后置++的特性,以及'\0'的本质为0,我么们可以将判断和循环条件同时改变。
代码如下:

include<stdio.h>

void my_strcpy(char* dest, char* sou)
{
while (dest++=sou++)
{
;
}
}
int main()
{
char arr1[] = "Hello World!";
char arr2[] = "***************";

my_strcpy(arr2, arr1);

return 0;

}
然而这串代码有一个致命缺陷,我们可能会一不小心将来源与目的地的指针传成空指针,导致函数错误

这时我们想到可以加入’‘断言’‘

include<stdio.h>

include<assert.h>

void my_strcpy(char* dest, char* sou)
{
assert(dest && sou);

while (*dest++=*sou++)
{
	;
}

}
int main()
{
char arr1[] = "Hello World!";
char arr2[] = "***************";

my_strcpy(arr2, arr1);

return 0;

}
当我们传错参时它会提醒我们。

我们可能会更加粗心,直接将目的地与来源的指针传反,这时我们可以使*sou的值不能改变来避免。我们可以使用const来修饰sou

include<stdio.h>

include<assert.h>

void my_strcpy(char* dest,const char* sou)
{
assert(dest && sou);

while (*dest++=*sou++)
{
	;
}

}
int main()
{
char arr1[] = "Hello World!";
char arr2[] = "***************";

my_strcpy(arr2, arr1);

return 0;

}
当我们仔细查看strcpy函数的定义是发现strcpy函数是有返回值的,返回类型为char*。strcpy函数的返回值我们可以形成函数的链式访问

include<stdio.h>

include<assert.h>

char * my_strcpy(char* dest,const char* sou)
{
assert(dest && sou);
char* ret = dest;
while (dest++=sou++)
{
;
}
return ret;
}
int main()
{
char arr1[] = "Hello World!";
char arr2[] = "***************";

printf("%s", my_strcpy(arr2, arr1));

return 0;

}

————————————————
版权声明:本文为CSDN博主「真的王」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_62179366/article/details/123098864

标签:dest,char,++,strcpy,sou,my
From: https://www.cnblogs.com/keep--fighting/p/17741758.html

相关文章

  • 120.strcpy函数和strncpy函数的区别?哪个函数更安全?
    120.strcpy函数和strncpy函数的区别?哪个函数更安全?1.函数原型char*strcpy(char*strDest,constchar*strSrc)char*strncpy(char*dest,constchar*src,size_tn)2.安全性strcpy函数:如果参数dest所指的内存空间不够大,可能会造成缓冲溢出(bufferOverflow)的错误......
  • strlen/strcpy/strcat的模拟实现
    char*my_strcat(char*dest,constchar*src){ assert(dest!=NULL);//字符串要以‘\0’结束,目标空间要足够大,且可修改 assert(src!=NULL); char*ret=dest; //1,找到目的字符串的\0; while(*dest!='\0') { dest++; } //2,追加 while(*dest++=*src++) { ; } returnr......
  • 104.字符串函数:strlen函数,strcpy函数,strcat函数,strcmp函数
    104.字符串函数:strlen函数,strcpy函数,strcat函数,strcmp函数1.字符串函数strlen(1)strlen函数strlen函数返回的是在字符串中’\0’前面出现的字符的个数(2)strlen的使用a.代码#include<stdio.h>#include<string.h>intmain(){ charstr1[]="abcdef"; printf("%d\n",s......
  • 112.说一说strcpy、sprintf与memcpy这三个函数的不同之处
    112.说一说strcpy、sprintf与memcpy这三个函数的不同之处1.复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。2.复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3......
  • 100.你知道strcpy和memcpy的区别是什么吗?
    100.你知道strcpy和memcpy的区别是什么吗?1.复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。2.复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的......
  • strcpy、strncpy与memcpy的区别你了解吗?
    一、定义1.memcpy函数void*memcpy(void*destin,void*source,unsignedn);作用:函数memcpy从source指向的对象中复制n个字符到destin指向的对象中返回值:函数memcpy返回destin的指针。2.strcpy函数charstrcpy(chardest,constchar*src);作用:函数strcpy把src指向的......
  • C语言的strcpy()函数
    strcpy()函数的简介strcpy()函数用于将一个字符串拷贝到另一个内存地址的函数,拷贝停止的条件是遇到'\0',同时会将'\0'一同拷贝到目标地址。下面是strcpy()函数的声明:char*strcpy(char*destination,constchar*source);1.函数的参数:char*destination---------目标字......
  • assert断言与const修饰指针的妙用(模拟实现strcpy函数)
     assert断言目录assert断言的妙用:头文件:使用方法:const修饰指针的妙用主要用法const在*左边const在*右边断言和const修饰指针的应用模拟实现C语言strcpy函数  1、若字符串str1,str2有空指针怎么办?  2.str2改变了怎么办?assert断言的妙用:头文件:#include<assert.h>使用方法:当......
  • 自己实现strcpy
    /*printfexample*/#include<stdio.h>char*my_strcpy(char*des,constchar*src){char*ret=des;while(*src!='\0'){*des++=*src++;}*des=*src;returnret;}intmain(){chardes[]="#####......
  • strcpy函数
    strcpy函数#include<stdio.h>#include<string.h>#include<stdlib.h>char*mystrcpy(char*a,char*b){if(NULL==a||NULL==b){printf("参数错误\n");exit(-1);}char*p=a;while(*p++=*b++);returna;}intmain(......