在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: