信息发布→ 登录 注册 退出

一篇文章教你如何用C语言实现strcpy和strlen

发布时间:2026-01-11

点击量:
目录
  •  自己实现strcpy、strlen
    • strcpy的实现
    • strlen的实现
  • 总结

     自己实现strcpy、strlen

    strcpy的实现

    思路:

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

    void my_strcpy(char* dest, char* src){
        while (*src !='\0'){
            *dest = *src;
            src++;
            dest++;
        }
        *dest = *src;
    }
    
    //自己实现strcpy
    int main(){
        char arr1[]="$$$$$$$$$$";
        char arr2[]="hello";
        my_strcpy(arr1,arr2);//将arr的内容复制到arr1中
        printf("%s\n",arr2);
        return 0;
    }
    

    优化1:

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

    void my_strcpy(char* dest, char* src){
        while (*src !='\0'){
            *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 <assert.h>
    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("%s\n",arr2);
        return 0;
    }
    

    优化4:

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

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

    #include <assert.h>
    void my_strcpy(char* dest,const char* src){
        assert(dest != NULL);
        assert(src != NULL);
        while (*dest++ = *src++);  //这里写反的话将不能进行赋值   因为c
        *dest = *src;
    }
    

    对于const的讲解

    const int* p = &num;
    int* const p = &num;
    const int* const p = &num;
    

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

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

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

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

    优化5:

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

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

    总结

        1. 分析参数的设计(命名,类型),返回值的情况。
        2. 关于野指针问题,空指针的危害。
      	3. assert的使用方式和作用
      	4. 参数部分使用const,以及const的作用。
      	5. 注释的重要性。
    

    strlen的实现

    #include <assert.h>
    int my_strlen(const char* str){//不希望我的字符串被修改。
        int count = 0;
        assert(str != NULL);//用来保证指针的有效性
        while(*str !='\0'){
            count++;
            str++;
        }
        return count;
    }
    
    int main(){
        char arr[] = "abcdef";
        int len = my_strlen(arr);
        printf("%d\n",len);
        return 0;
    }
    

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注的更多内容!

    在线客服
    服务热线

    服务热线

    4008888355

    微信咨询
    二维码
    返回顶部
    ×二维码

    截屏,微信识别二维码

    打开微信

    微信号已复制,请打开微信添加咨询详情!