服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 一篇文章教你如何用C语言实现strcpy和strlen

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

2022-08-11 09:52黎丶辰 C/C++

这篇文章主要为大家介绍了C语言实现strcpy和strlen的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

 自己实现strcpy、strlen

strcpy的实现

思路:

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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直接在表达式中自加,先试用后加所以使用后置++

?
1
2
3
4
5
6
void my_strcpy(char* dest, char* src){
    while (*src !='\0'){
        *dest++ = *src++;
    }
    *dest = *src;
}

优化2:

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

?
1
2
3
4
void my_strcpy(char* dest, char* src){
    while (*dest++ = *src++);
    *dest = *src;
}

优化3:

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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 使得我们的原来的数据不能被拷贝数据不能进行修改。从强制检测。另一方面解释:源头的数据的安全性得到保证。

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

对于const的讲解

?
1
2
3
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值修改了。又怎么办呢?在刷算法题的时候有个经验就是,在对地址进行操作之前先提前备份一份。然后将备份的这个地址位置返回即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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
4
5
1. 分析参数的设计(命名,类型),返回值的情况。
2. 关于野指针问题,空指针的危害。
3. assert的使用方式和作用
4. 参数部分使用const,以及const的作用。
5. 注释的重要性。

strlen的实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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;
}

总结

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

原文链接:https://blog.csdn.net/Tian_baby/article/details/122355246

延伸 · 阅读

精彩推荐
  • C/C++VScode配置C++运行环境的完整步骤

    VScode配置C++运行环境的完整步骤

    这篇文章主要给大家介绍了关于VScode配置C++运行环境的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    鱼大鹿10122021-10-18
  • C/C++C语言之没有main函数的helloworld示例

    C语言之没有main函数的helloworld示例

    这篇文章主要介绍了C语言之没有main函数的helloworld示例,本文分解了带main函数的helloworld示例,从而分析出不需要main函数的helloworld示例,需要的朋友可以参考下...

    C语言程序设计7772021-02-23
  • C/C++C++实现LeetCode(41.首个缺失的正数)

    C++实现LeetCode(41.首个缺失的正数)

    这篇文章主要介绍了C++实现LeetCode(41.首个缺失的正数),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang5312021-11-26
  • C/C++OpenCV实现图像膨胀

    OpenCV实现图像膨胀

    这篇文章主要为大家详细介绍了OpenCV实现图像膨胀,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    我有一個夢想10612021-11-17
  • C/C++如何基于 Blueprint 在游戏中创建实时音视频功能

    如何基于 Blueprint 在游戏中创建实时音视频功能

    我们在本文先来讲讲如何在 Unreal 中用 Blueprint 快速实现。稍后会分享基于 C++的实现步骤。感兴趣的朋友跟随小编一起看看吧...

    声网Agora8852021-09-08
  • C/C++c语言5个常用的排序算法实例代码

    c语言5个常用的排序算法实例代码

    这篇文章主要介绍了c语言5个常用的排序算法实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下...

    微book6952021-06-20
  • C/C++浅谈c++11线程的互斥量

    浅谈c++11线程的互斥量

    互斥量是个类对象,理解成一把锁(保护共享数据,其他想操作共享数据的线程必须等待解锁),互斥量使用要小心,保护数据不多也不少,少了则没达到...

    lsgxeva8042021-11-14
  • C/C++C++ 中重载和运算符重载加号实现矩阵相加实例代码

    C++ 中重载和运算符重载加号实现矩阵相加实例代码

    这篇文章主要介绍了C++ 中重载和运算符重载加号实现矩阵相加实例代码的相关资料,需要的朋友可以参考下...

    Limerence4862021-05-05