自己实现strcpy函数
来源:互联网 发布:网络用语py什么意思 编辑:程序博客网 时间:2024/06/05 10:04
问题描述:
自己实现一个MyStrcpy函数,要和C语言库函数的strcpy函数完成同样的功能。
问题分析:
首先我们要了解一下atoi函数它到底做了什么事情
(1) 函数原型
char *strcpy(char *dest, const char *src);
(2) 函数说明
dest 为目标字符串指针,src 为源字符串指针,该函数把src所指的由NULL结束的字符串复制到dest 所指的数组中,返回指向 dest 字符串的起始地址。
(3) 返回值
成功执行后返回目标数组指针 dest。
PS:
如果参数 dest 所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代。
根据以上的描述,我们可以来实现自己的代码了
参考代码:
#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <string.h>char* MyStrcpy1(char* dst, const char* src)//这种方案在大多数情况下是可以的,但是在内存重叠的情况下就会有问题{ if (dst == NULL || src == NULL) return NULL; if (dst == src) return dst; char *pTemp = dst; while ((*dst++ = *src++) != '\0'); return pTemp;}int MyStrlen(const char *pStr){ int nLen = 0; if (NULL == pStr) return 0; while (*pStr++ != '\0') nLen++; return nLen;}char * MyStrcpy2(char *dst, const char *src)//考虑内存重叠的情况,需要倒过来拷贝{ if (dst == NULL || src == NULL) return NULL; if (dst == src) return dst; char *ret = dst; int nLen = MyStrlen(src); dst = dst + nLen; src = src + nLen; int nLoop = nLen + 1; while (nLoop--) { *dst = *src; src--; dst--; } return ret;}int main(){ char str1[100] = "dcbaefad"; char str2[100]; printf("情况1:无内存重叠的情况\n"); //strcpy(str2, str1); //MyStrcpy1(str2, str1); MyStrcpy2(str2, str1); printf("%s\n", str2);//对于无内存重叠的情况三个函数都是可以的 printf("情况2:有内存重叠的情况\n"); //strcpy(str1 + 1, str1); //MyStrcpy1(str1 + 1, str1); MyStrcpy2(str1 + 1, str1); printf("%s\n", str1); //对于有内存重叠的情况,MyStrcpy1会崩溃,之所以会崩溃是因为程序陷入了死循环永远结束不了,直到遇到不可写内存导致崩溃 return 0;}
运行结果:
阅读全文
1 0
- 自己实现strcpy函数
- 自己实现strcpy函数
- 写程序实现自己的strcpy() 函数
- 面试题 自己实现strcpy 函数
- 自己实现strcpy字符串复制函数
- c/c++ strcpy函数的自己实现
- 实现自己的字符串拷贝函数Strcpy
- 自己模拟实现strcpy函数功能
- 自己编写函数,实现库函数里的strcpy函数
- 自己实现strcpy
- 自己实现strcpy
- 不用库函数,自己实现strcpy和memcpy函数
- 不用库函数,自己实现strcpy和memcpy函数
- 一步一步写算法(自己实现strcpy函数)
- 自己模拟strcpy库函数写的功能函数my_strcpy实现strcpy的功能,完整代码
- 请自己写出strcpy函数
- strcpy函数的实现
- strcpy函数实现
- XML的生成和解析
- Swift 3.0 iOS 如何绘制 1px 宽的描边
- 输入流和输出流:一个文件的字符要写到另一个文件中,首先要()
- Java还要再学一遍基础(一)认识java
- 自定义view之构造方法
- 自己实现strcpy函数
- Ubuntu清理
- Leetcode——69. Sqrt(x)
- JAVA虚拟机规范读书笔记--栈,堆,方法区(内存分配)
- PAT 甲级 1008. Elevator
- 模板方法模式
- Java网络编程入门
- 设计模式
- 进程调度之linux 用户态抢占和内核态抢占