0.1 strcpy的实现

0.1 strcpy的实现,第1张

0.1 strcpy的实现 自己实现strcpy、strlen strcpy的实现 思路:

通过指针访问地址然后将要copy的文本逐一复制到目的地。

void my_strcpy(char* dest, char* src){
    while (*src !=''){
        *dest = *src;
        src++;
        dest++;
    }
    *dest = *src;
}

//自己实现strcpy
int main(){
    char arr1[]="$$$$$$$$$$";
    char arr2[]="hello";
    my_strcpy(arr1,arr2);//将arr的内容复制到arr1中
    printf("%sn",arr2);
    return 0;
}
优化1:

在my_strcpy()函数中*dest和*src直接在表达式中自加,先试用后加所以使用后置++

void my_strcpy(char* dest, char* src){
    while (*src !=''){
        *dest++ = *src++;
    }
    *dest = *src;
}
优化2:

在while循环中,因为最后的终止条件是赋值到了绝对0的时候停止循环。那么最后一次赋值就是赋值0。那我们直接可以将赋值作为我们的终止条件。

void my_strcpy(char* dest, char* src){
    while (*dest++ = *src++);
    *dest = *src;
}
优化3:

如果传入的是空指针我们应该告诉这个输入有问题。

引入assert();断言–>如果输入错误显示错误。 个人理解就像java,python中的异常处理。

#include 
void my_strcpy(char* dest, char* src){
    assert(dest != NULL);
    assert(src != NULL);
    while (*dest++ = *src++);
    *dest = *src;
}
//自己实现strcpy
int main(){
    char arr1[]="$$$$$$$$$$";
    char arr2[]="hello";
    my_strcpy(arr1,NULL);//将arr的内容复制到arr1中
    printf("%sn",arr2);
    return 0;
}
优化4:

在程序员将dest 和 src写反的情况。我们应该怎么处理呢?

加const 使得我们的原来的数据不能被拷贝数据不能进行修改。从强制检测。另一方面解释:源头的数据的安全性得到保证。

#include 
void my_strcpy(char* dest,const char* src){
    assert(dest != NULL);
    assert(src != NULL);
    while (*dest++ = *src++);  //这里写反的话将不能进行赋值   因为c
    *dest = *src;
}
对于const的讲解
const int* p = #
int* const p = #
const int* const p = #

在第一行中:即const 放在指针变量* 的左边的时候修饰的是*p 也就是说也就是说不能通过*p来改变*p(num )的值。

在第二行中:即const放在指针变量* 的右边的时候修饰的是指针本身p,p不能被改变。

在第三行中:两边都进行const修饰,p与*p都不能改变了。

我的理解:const只能修饰关键字本身右边的第一个东西(像int*就直接理解为指针)。const修饰的东西被限制。

优化5:

在官方提供的库函数中strcpy是有返回值的。返回什么呢?我们应该返回copy执行完成之后的字符串中首字母的地址。但是我们发现之前已经在执行的过程中就将dest值修改了。又怎么办呢?在刷算法题的时候有个经验就是,在对地址进行 *** 作之前先提前备份一份。然后将备份的这个地址位置返回即可。

#include 
char* my_strcpy(char* dest,const char* src){
    char* res = dest;
    assert(dest != NULL);
    assert(src != NULL);
    while (*dest++ = *src++);
    *dest = *src;//将''进行赋值。
    return res;
}

总结:1. 分析参数的设计(命名,类型),返回值的情况。

  2. 关于野指针问题,空指针的危害。
  	3. assert的使用方式和作用
  	4. 参数部分使用const,以及const的作用。
  	5. 注释的重要性。
strlen的实现
#include 
int my_strlen(const char* str){//不希望我的字符串被修改。
    int count = 0;
    assert(str != NULL);//用来保证指针的有效性
    while(*str !=''){
        count++;
        str++;
    }
    return count;
}

int main(){
    char arr[] = "abcdef";
    int len = my_strlen(arr);
    printf("%dn",len);
    return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5698843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存