strcpy函数

举报
悦来客栈的老板 发表于 2020/12/30 01:26:55 2020/12/30
【摘要】 网上流行的标准实现   #include <stdio.h> char *strcpy(char *dest, const char *src){ char *address = dest; //保存原目标地址 if (dest == NULL || src == NULL) { return NULL; //也可以使用断言 } while(...

网上流行的标准实现

 


  
  1. #include <stdio.h>
  2. char *strcpy(char *dest, const char *src)
  3. {
  4. char *address = dest; //保存原目标地址
  5. if (dest == NULL || src == NULL)
  6. {
  7. return NULL; //也可以使用断言
  8. }
  9. while((*dest++ = *src++) != '\0') //逐个复制,我们可以看到这是很危险的,如果dest指向src后边一点的内存,就会复制出错。
  10. ;
  11. return address; //返回源地址
  12. }
  13. int main()
  14. {
  15. char a[1000];
  16. char b[1000];
  17. gets(a);
  18. strcpy(b,a);
  19. puts(b);
  20. return 0;
  21. }


linux源码


  
  1. /**
  2. * strcpy - Copy a %NUL terminated string
  3. * @dest: Where to copy the string to
  4. * @src: Where to copy the string from
  5. */
  6. char *strcpy(char *dest, const char *src)
  7. {//判断dest与src是否合法应该是程序员的事
  8. char *tmp = dest;
  9. while ((*dest++ = *src++) != '\0')
  10. /* nothing */;
  11. return tmp;
  12. }


 

 

freebsd源码


  
  1. char *
  2. strcpy(char * __restrict to, const char * __restrict from)
  3. {
  4. char *save = to;
  5. for (; (*to = *from); ++from, ++to);
  6. return(save);
  7. }


 

glibc中的strcpy的代码如下

 


  
  1. /* Copy SRC to DEST. */
  2. char *strcpy (dest, src)
  3. char *dest;
  4. const char *src;
  5. {
  6. register char c;
  7. char * s = (char *)src;
  8. const int off = dest - s - 1;
  9. do
  10. {
  11. c = *s++;
  12. s[off] = c;
  13. }
  14. while (c != '\0');
  15. return dest;
  16. }


 

某牛人写的一个汇编的代码


  
  1. char *strcpy(char *dest, const char *src)
  2. {
  3. __asm
  4. {
  5. mov eax, dest
  6. mov edx, src
  7. Begin:
  8. mov ecx, DWORD PTR [edx]
  9. cmp ecx, 0
  10. je End
  11. mov DWORD PTR [eax], ecx
  12. inc eax
  13. inc edx
  14. jmp Begin
  15. End:
  16. mov DWORD PTR [eax], 0
  17. mov eax, dest

  
  1. }
  2. }


 

利用库函数memcpy


  
  1. char *strcpy(char *dest, const char *src)
  2. {
  3. const char *end = src;
  4. while (*end)//先找到字符串的结束位置
  5. {
  6. end++;
  7. }
  8. memcpy(dest, src, end-src+1);//再利用库函数memcpy一次将字符串拷贝过来
  9. return dest;
  10. }


 

 

 

 

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/11801461

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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