字符串拷贝函数:strcpy的详解及模拟实现

简介: 字符串拷贝函数:strcpy的详解及模拟实现

对于字符串拷贝函数,之前在学习字符串时候,就已经学习过,但那只是片面的学习了一下,并没有经过系统的分析!只是大概的学习了一下!在关键的地方有时候还不知道该怎么用!所以出现学习跟没有学一样的效率!因此,笔者最近再次系统的学习了一下:所以才打算发一篇文章:  字符串拷贝函数:strcpy的详解及模拟实现 !来与大家共勉!


首先对于字符串拷贝函数:strcpy 我们需要知道:


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

上述的代码是指:在strcpy函数使用的时候,需要注意的格式问题!!对于destination 是指 :目的地  ,  source  是指:源头!!该片段的总体意思是:将源头拷贝到目的地!


对于本文的学习之前,需要知道一下知识储备!:


1.源字符串必须以'\0'结尾!


2.strcpy字符串拷贝函数:会将源字符串中的'\0'拷贝到目标空间!


3.目标空间必须足够大,以确保能存放源字符串!!


4.目标空间必须可变!(不能被const修饰)!


5.要学会strcpy字符串拷贝函数的模拟实现!


对于strcpy字符串拷贝函数!我们先做一下知识储备:


#include <stdio.h>
#include <string.h>
int main()
{
  char arr[10] = { 0 };
  const char* p = "abcdef";
  strcpy(arr, p);
  printf("%s\n", arr);
  return 0;
}

这段代码就是对于:strcpy字符串拷贝函数的简单实现!!想必大家也都能看懂!


代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


但是对于:const char* p = "abcdef";中的'\0'要不要拷贝到arr[10]里面去??心存疑惑!!


因此,我们可以将arr[10]数组进行初始化为:arr[10]="xxxxxxxxx"!!这样操作,加上调试,更能直观的看出来!


因此更改后的代码为:虽然结果也是一样的,但是在调试的过程中,可以显现出来:strcpy字符串拷贝函数:会将源字符串中的'\0'拷贝到目标空间!


2d65d23f6d4748949b924e4057485923.png


代码调试前的结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


请注意:arr[10]数组里面值的变化!


代码调试完成以后的结果为:


12c3b7f3f8814309a195c64f051d4445.png


综上代码的调试结果所述:strcpy字符串拷贝函数:会将源字符串中的'\0'拷贝到目标空间!


但是,在使用strcpy拷贝字符串中,必须要知道'\0‘所在的位置:因此,对于字符数组的拷贝就会出现问题!!请看下列代码::


#include <stdio.h>
#include <string.h>
int main()
{
  char arr[10] = "xxxxxxxxx";
  char arr2[] = { 'a','b','c' };
  strcpy(arr, arr2);
  printf("%s\n", arr);
  return 0;
}

对于上述的代码中:由于在字符数组中:'\0'的位置并不知道,导致越界访问,所以会出现错误!!


请看代码的运行结果:


34e8d716411043c08c7ffba9fbba23de.png


对于上述的出现错误的代码,笔者就不再进行调试了!请各位老铁可以理解一下!!


但是,当使用字符数组进行strcpy进行拷贝时候,手动放置一个'\0'!也可以进行正常的拷贝使用!!


92ba0822ed0b46e1ae72df8a17d3a45b.png


在这个代码中,拷贝的时候,也会将'\0'进行拷贝!!对于此问题,我们依然 可以通过调试来进行分析!


在调试完成之前的:


d79b274929334152a6d38be91e2d1be3.png


调试完成之后:


dfc80ca9d8004e6c9ddc00e8448ffc6a.png


在上述的调试结果中:我们可以清晰地看出来!在字符数组中,手动放置的'\0'也会进行拷贝!!


结合以往经验,笔者苦心专研了两个错误写法,下面请笔者……看一下代码:


1.目标空间必须足够大,以确保能存放源字符串!!否则,将会出现崩溃现象!!错误演示,请忽模仿


#include <stdio.h>
#include <string.h>
int main()
{
  char arr[3] = { 0 };
  char arr2[] = "abcdef";
  strcpy(arr, arr2);
  printf("%s\n", arr);
  return 0;
}

代码的运行结果为:


0a2653c851af460fa595bd959398a8f1.png


程序崩溃!!


2.目标空间必须可变!(不能被const修饰,常量字符串不可被修改)!错误演示,请忽模仿


#include <stdio.h>
#include <string.h>
int main()
{
  char* p = "hello world";
  char arr2[] = "abcdef";
  strcpy(p, arr2);
  printf("%s\n", p);
  return 0;
}

该段代码的运行结果为:


2d65d23f6d4748949b924e4057485923.png


直接出现错误,不能被更改!!


上面两个是笔者之前专研的!!对于其他的bug若是读者有不同的想法,请私聊笔者哟!


下面笔者进行对strcpy字符串拷贝函数的模拟实现!!!也到了该拿出压箱底的实力了!!


请看笔者代码:


#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
  assert(dest);
  assert(src);
  char* ret = dest;
  while (*dest++ = *src++)
  {
  ;
  }
  return ret;
}
int main()
{
  char arr1[20] = "abc";
  char arr2[] = "hello wang";
  my_strcpy(arr1, arr2);
  printf("%s\n", arr1);
  return 0;
}

对于上述代码中:


1.    assert(dest);   assert(src);  断言,因为在后面的文章中,对dest 与src都进行了解引用操作,所以在使用之前要确保不是空指针!!


2.在while循环里面,为什么是:*dest++ = *src++  而不是:*dest=*src;  dest++; src++;呢 ???其实主要的原因还是在于拷贝'\0'的问题,当while 循环里面判断出来是'\0'则会进行跳出,不会拷贝'\0';所以进行了上述while循环里面的操作!!实现先赋值在判断!!


3.为什么在最后的返回值是:return ret;????而不是 return  dest;??? 原因在于:随着dest++与src++的赋值,dest早已不再指向起始位置!!


代码的运行结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


上述就是笔者对该strcpy字符串拷贝函数的模拟实现的解析,若有不懂得老铁,请私聊笔者哟!!


相关文章
|
C语言
模拟库函数strcpy
关于库函数strcpy()的详细内容,跳转文章:《C语言:字符串拷贝函数strcpy()》
34 0
|
6月前
strcat与strncat函数使用与模拟实现
strcat与strncat函数使用与模拟实现
37 0
|
6月前
|
安全 C语言
【C语言】strcpy与strncpy函数的使用和模拟实现
【C语言】strcpy与strncpy函数的使用和模拟实现
55 0
strstr函数的使用及模拟实现
1.strstr函数 2.strstr函数的使用 3.strstr函数的模拟实现
142 0
strcpy与strncpy的模拟与实现
strcpy与strncpy的模拟与实现
47 0
|
6月前
|
PHP C++
[字符串和内存函数]strcpy和strlen字符串函数的详解和模拟
[字符串和内存函数]strcpy和strlen字符串函数的详解和模拟
66 0
|
11月前
模拟实现库函数strlen
模拟实现库函数strlen
29 0
|
C语言
【C语言进阶】-- 重点字符串函数内存函数及其模拟实现(strlen,strcmp,strcat...memcpy,memmove)
【C语言进阶】-- 重点字符串函数内存函数及其模拟实现(strlen,strcmp,strcat...memcpy,memmove)
strcpy函数与strncpy函数
strcpy函数与strncpy函数
|
编译器 C语言
C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现
C语言strlen,strcpy ,strcat, strcmp,strstr常用库函数的理解与模拟实现
133 0