C 库函数 - strcpy()
描述
c
char *strcpy(char *dest, const char *src)
把 src 所指向的字符串复制到 dest。
需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。
声明
下面是 strcpy() 函数的声明:
c
char *strcpy(char *dest, const char *src)
参数
dest -- 指向用于存储复制内容的目标数组。
src -- 要复制的字符串。
返回值
该函数返回一个指向最终的目标字符串 dest 的指针。
模拟实现
1.0
c
void my_strcpy(char* dest, char* src)//版本一
{
while (*src != '\0')
{
*dest = *src;
src++;
dest++;
}
*dest = *src;
}
2.0
c
// 满足递进关系与后置++,简化代码
//(缺点,指针解引用前无保护)
void my_strcpy(char* dest, char* src)
{
while (*dest++ = *src++) //'\0' 为假,控制循环
;
}
3.0
c
//优化三:在解引用指针前,判断指针的有效性(必须)
//(虽防止出现野指针,但没提示出哪里出错)
void my_strcpy(char* dest, char* src)
{
if (src != NULL&&dest != NULL)
{
while (*dest++ = *src++)
;
}
}
4.0
c
//编写代码时,我们总是会做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式。
#include<assert.h>
void my_strcpy(char* dest, char* src)//法四:断言法(在保护的基础上,告诉错误在哪)
{
assert(dest != NULL); //fail(失败,不成功)
assert(src != NULL);
if (src != NULL){
while (*dest++ = *src++);
}
}
5.0
c
#include <assert.h>
#include <stddef.h> // 引入 NULL 定义
char* my_strcpy(char* dest, const char* src)
{
// 1. 断言:只在 Debug 下检查,暴露写代码的人的 Bug
assert(dest != NULL);
assert(src != NULL);
// 2. 标准库行为:如果传入 NULL,未定义行为,我们让它在 Release 下直接崩溃(而非静默)
// 实际上 assert 在 Release 下被剥离,所以如果有风险,可在 Release 下加条件判断主动崩溃
if (dest == NULL || src == NULL) {
return NULL; // 或者 abort(); 但绝不能静默复制!
}
char* ret = dest;
// 3. 复制(内存重叠不考虑,那是 memmove 的事)
while (*dest++ = *src++)
;
return ret;
}