在c语言库中,函数strcpy可以实现字符串的复制,当然我们也可以通过代码的方式实现,今天我给大家介绍实现strcpy功能代码的优化过程。
代码1:
#include <stdio.h>
void my_strcpy(char* dest, char* src)
{
  while(*src != '\0')
  {
    *dest = *src;
    dest++;
    src++;
  }
  *dest = *src;
}
int main()
{
  char arr1[] = "########";
  char arr2[] = "bit";
  my_strcpy(arr1, arr2);
  printf("%s\n", arr1);
  return 0;
}在这个代码中我们可以简单的实现字符串的复制功能,定义my_strcpy函数时,代码有缺点:实现效率低和占总内存空间大。
优化1:
#include <stdio.h>
void my_strcpy(char* dest, char* src)
{
  while (*dest++=*src++)
  {
    ;
  }
}
int main()
{
  char arr1[] = "########";
  char arr2[] = "bit";
  my_strcpy(arr1, arr2);
  printf("%s\n", arr1);
  return 0;
}经过这次优化,我们可以通过*dest++=*src++的循环设置实现字符串的复制,并且在最后一次循环中,代码可以巧妙地实现赋值’\0‘并停止循环。
优化2:
#include <stdio.h>
#include <assert.h>
void my_strcpy(char* dest, char* src)
{
  assert(dest != NULL);
  assert(src != NULL);
    while (*dest++ = *src++)
    {
      ;
    }
}
int main()
{
  char arr1[] = "########";
  char arr2[] = "bit";
  my_strcpy(arr1, arr2);
  printf("%s\n", arr1);
  return 0;
}经过这次优化,在代码中加入断言(assert),可以让代码具有报错运行停止的功能。如果我们在传参时传入的是NULL(空指针),代码会报错停止。
优化3:
#include <stdio.h>
#include <assert.h>
void my_strcpy(char* dest, const char* src)
{
  assert(dest != NULL);
  assert(src != NULL);
  while (*dest++ = *src++)
  {
    ;
  }
}
int main()
{
  char arr1[] = "########";
  char arr2[] = "bit";
  my_strcpy(arr1, arr2);
  printf("%s\n", arr1);
  return 0;经过这次优化,我们在char* src前加 const修饰,会让char* src值无法被改变。如果我们在输入代码时搞错dest 和src的位置,代码会运行错误。
优化四:
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src)
{
  char* ret = dest;
  assert(dest != NULL);
  assert(src != NULL);
  while (*dest++ = *src++)
  {
    ;
  } 
  return ret;
}
int main()
{
  char arr1[] = "########";
  char arr2[] = "bit";
  printf("%s\n", my_strcpy(arr1, arr2));
  return 0;
}通过查阅strcpy函数的相关资料,我们可以发现strcpy的定义方式以及返回值,这次的优化会让我们的代码更加健壮。

浅浅地看一下运行结果ba:











