返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >一篇文章教你如何用C语言实现strcpy和strlen
  • 658
分享到

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

2024-04-02 19:04:59 658人浏览 泡泡鱼
摘要

目录 自己实现strcpy、strlenstrcpy的实现strlen的实现总结 自己实现strcpy、strlen strcpy的实现 思路: 通过指针访问地址

 自己实现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;
}

总结

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

--结束END--

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

本文链接: https://lsjlt.com/news/161795.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一篇文章教你如何用C语言实现strcpy和strlen
    目录 自己实现strcpy、strlenstrcpy的实现strlen的实现总结 自己实现strcpy、strlen strcpy的实现 思路: 通过指针访问地址...
    99+
    2024-04-02
  • 一篇文章教你用C语言模拟实现字符串函数
    目录前言模拟1.strlen 函数2.strcpy 函数3.strcat 函数4.strcmp函数5.strncpy函数6.strncat函数7.strncmp函数8.strstr函...
    99+
    2024-04-02
  • 一篇文章教你自己动手实现C语言库函数
    目录memmove函数声明函数作用实现memmovememcpy函数声明函数作用实现memcpystrstr函数声明函数作用实现strstrstrcat函数声明函数作用实现strca...
    99+
    2024-04-02
  • 一篇文章带你入门C语言:数组
    目录数组一维数组初始化使用总结:内存存储二维数组创建初始化数组越界问题数组作函数参数应用实例总结数组 一维数组 创建 定义 数组是一组相同类型的元素的集合。那数组的语法形式: t...
    99+
    2024-04-02
  • 一篇文章带你入门C语言:函数
    目录函数定义库函数定义介绍Example 1 strcpyExample 2 memset自定义函数Example 1Example 2 两数交换链式访问Example 1函数声明函...
    99+
    2024-04-02
  • 一篇文章带你使用C语言编写内核
    目录gcc 命令文件头将内核载入内存总结gcc 命令 使用 gcc 编译 c语言 -c 编译、汇编到目标代码,不进行链接,也就是直接生成目标文件 -o 将输出...
    99+
    2024-04-02
  • 一篇文章带你用C语言玩转结构体
    目录前言一、结构体的声明与定义1.结构体的声明2.结构成员的类型3.结构体的定义二、初始化结构体三、访问结构体成员四、结构体嵌套五、结构体指针六、结构体传参总结前言 C语言提供了不同...
    99+
    2024-04-02
  • 一篇文章教你如何理解SQL
    这篇文章主要介绍了一篇文章教你如何理解SQL,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SQL 是一种为数不多的声明性语言,它的运行方式完...
    99+
    2024-04-02
  • 一篇文章带你入门C语言:操作符
    目录操作符分类算术操作符移位操作符整数存储规则左右移位规则赋值操作符单目操作符取地址操作符& 解引用操作符*类型长度操作符sizeof按位取反操作符~++ -- 操作符强制类...
    99+
    2024-04-02
  • 一篇文章带你了解C语言操作符
    目录一、操作符分类 二、算术操作符三、移位操作符1、左移操作符 2、右移操作符2.1算术移位 2.2逻辑移位 四、位操作符 1、按位...
    99+
    2024-04-02
  • 一篇文章带你实现C语言中常用库函数的模拟
    目录前言函数介绍strlen(求字符串长度)strcpy(字符串拷贝)strcat(字符串追加)strcmp(字符串比较)strstr(找子字符串)memcpy(内存拷贝)memmo...
    99+
    2024-04-02
  • 一篇文章教你如何用 Python 记录日
    (点击上方公众号,可快速关注)编译: Python开发者 - 李趴趴要化身女超人,英文:Mario Corcherohttp://python.jobbole.com/89007/对一名开发者来说最糟糕的情况,莫过于要弄清楚一个不熟...
    99+
    2023-01-31
    教你 一篇文章 如何用
  • 一篇文章教你用React实现菜谱系统
    目录一、菜谱大全1.1、项目背景1.2、技术栈1.3、开发环境1.4、项目效果展示1.5、项目初始化二、首页开发2.1、antd-mobile 组件库2.2、底部导航实现2.3、菜谱...
    99+
    2024-04-02
  • 一篇文章带你了解C语言的文件操作
    目录为什么使用文件什么是文件程序文件数据文件文件名文件的打开和关闭文件指针fopen和fclose函数文件的顺序读写总结为什么使用文件 我们在想既然是通讯录就应该把信息记录下来,只有...
    99+
    2024-04-02
  • 一篇文章教你用Python实现一键文件重命名
    目录应用背景准备工作上脚本view.py功能展示打包方式windows打包方式:pycharm打包为exe执行文件方法总结应用背景 背景:“由于工作需要可能需要对一些文件进行重命名的...
    99+
    2024-04-02
  • 一篇文章带你了解C语言:入门基础
    目录C语言本身特点数据类型常量变量变量分类使用小建议生命周期作用域常量分类及其特点字符串+转义字符+注释字符串转义字符两种注释选择循环语句函数数组总结闲话少说,先上思维导图。 如图...
    99+
    2024-04-02
  • 一篇文章带你了解C语言内存对齐
    目录内存对齐三、在内存对齐话题下的sizeof与offsetof宏3.1、sizeof3.2、offsetof宏3.3、Debug总结内存对齐 先看如下代码: 结构体Test1...
    99+
    2024-04-02
  • 一篇文章带你了解C语言函数递归
    目录什么是递归?递归的两个必要条件递归实例实例1(按照顺序打印一个数的整形值)画图讲解 完整代码 实例2 (使用函数在不创建变量的情况下求字符串长度)画图讲解程序...
    99+
    2024-04-02
  • 一篇文章带你了解C语言二分查找
    目录总结我们常常需要对数据进行查找,修改,查找数据有许多方法,我们先看看最简单的顺序查找 int main() { int i, k = 0; scanf("%d", &am...
    99+
    2024-04-02
  • 一篇文章带你了解C语言指针进阶
    目录1.字符指针2.指针数组3.数组指针4.函数指针5.数组传参总结1.字符指针 我们已经知道了数组名在大部分时候表示数组的地址,指针本质上也表示一个地址,那么我们能否用指针来创建一...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作