字符串拷贝的一系列问题
来源:互联网 发布:2016年淘宝9月消保新规 编辑:程序博客网 时间:2024/05/21 23:31
对于字符串处理的函数有很多,这里我们只讨论拷贝的函数
首先我们来看一下strcpy()函数
#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strcpy(char *dst, const char *src){assert(dst && src);char *ret = dst;while (*dst++ = *src++);return ret;}
这是一种简单但是又高效的拷贝函数,它是遇到'\0'就会停止往后的拷贝,这也就是局限所在的地方,如果我有一个字符数组a[10]={0},我想把这些个字符拷贝到另外一个数组中去,这个函数就不能完成这个工作,这个时候我们就需要用另外一种函数memcpy()来进行拷贝,首先看一下memcpy()的原型是怎样的,
void * __cdecl memcpy ( void * dst, const void * src, <span style="color:#ff0000;">size_t count</span> )函数返回值是无类型的指针,接收的参数是两个无类型的指针和一个整形变量,这个函数是直接对内存进行操作的,前两个参数一个目的串,一个是源串,第三个变量是要拷贝的字节数,在操作的时候要将无类型的指针强制转换成字符型的指针进行操作,实现如下:
void *my_memcpy(void *dst, const void *src, int count){void *ret = dst;char *p1 = (char *)dst;char *p2 = (char *)src;while (count--){*p1++ = *p2++;}return ret;}注意的是这个函数对内存操作时不会检查当前数组是否越界!!!
然而这个函数并不能解决内存覆盖的拷贝比如下面这张图所示:
当遇到这个问题是其实解决问题很简单就是从后往前拷贝,但是怎样的条件下才应该选择从后往前拷贝呢?其实观察下面的图不难发现
只有当要拷贝到的起始地址在拷贝的字符串的地址之间时存在内存覆盖的问题,所以库有为我们提供了memmove()这个函数来解决这个问题,它可以完成memcpy()不能完成的事情,也能完成memcpy()能完成的事情。我们自己的实现是这样的:
void *my_memmove(void *dst, const void *src, int count){char *ret = dst;char *p1 = (char *)dst;char *p2 = (char *)src;if (p1 > p2&&p1 < (p2 + count)){while (count--)*(p1 + count) = *(p2 + count);}else{while (count--)*p1++ = *p2++;}return ret;}
使用memcpy()、memmove()时要记得加上头文件#include<memory.h>
以上函数都是纯手打,有问题的请指出来!! 2 0
- 字符串拷贝的一系列问题
- 字符串拷贝的问题
- 字符串拷贝的错误
- UniCode字符串的拷贝
- 字符串的拷贝
- 字符串的拷贝
- 字符串的拷贝
- 字符串的选择性拷贝
- QMessageBox的一系列问题
- QMessageBox的一系列问题
- jpush使用的一系列问题
- 最近遇到的一系列问题
- NDK遇到的一系列问题
- 新装MySQL的一系列问题
- 一系列问题
- 字符串拷贝strcpy的实现
- 字符串拷贝引起的bug
- memccpy() -- string字符串的拷贝
- 浅谈 Nim 中的“接口”
- 欢迎使用CSDN-markdown编辑器
- junit单元测试
- IP数据报、TCP报文、UDP报文格式
- LeetCode_Jump Game II
- 字符串拷贝的一系列问题
- 我的第一篇博客
- C#把时间秒数转化成时间格式字符串00:00:00
- SHELL
- ActivityManager 获取系统进程信息
- 仿QQ控件,朋友圈
- HDU 4336 Card Collector [概率DP]
- Qt从零开始制作串口调试助手-(第十二章、串口数据发送)-Creator_Ly
- 博客地址迁移