关于字符串复制函数my_strcpy的三种方法
来源:互联网 发布:石原慎太郎 知乎 编辑:程序博客网 时间:2024/05/22 15:22
#include <stdio.h>#include <assert.h>#define SIZE 16#define CONTAIN_OF_ZERO_BYTE(n) \(((n - 0x01010101) & (~n)) & 0x80808080) //n=0 0xff & 0xff->0xff //n=1 0x00 & 0xfe->0x00 //n=2 0x01 & 0xfd->0x01…… //由上知:只有整个字节都为0时,整个表达式才为真char* MyStrcpy(char* dest,const char* src){char* ret = dest;assert((dest != NULL) && (src != NULL)); //if ((dest != NULL) && (src != NULL))while (*dest++ = *src++); //while(*src != '\0') //*dest++ = *src++;return ret;}char* MyStrcpy1(char* dest,const char* src){ char* ret =dest; int delta = dest - src; //delta 的作用是用来建立的dest 与src之间的关系 //当进行复制操作时就可以减少对的dest指针运算的时间了,从而优化算法 assert((dest != NULL) && (src != NULL)); while(*(char*)(src+delta) = *src++);//指针(src+delta)其实就是的dest的地址 return ret;}char* MyStrcpy2(char* dest,const char* src){int* IntDest = (int*)dest;int* IntSrc = (int*)src;char* ret = dest;while(1){//判断输入字符中是否有字节为0,没有则执行每四字节复制,否则则执行逐字节复制if(!CONTAIN_OF_ZERO_BYTE(*IntSrc)){*IntDest++ = *IntSrc++;//进行4字节复制continue;}dest =(char*)IntDest;src =(char*)IntSrc;while(*dest++ = *src++);//进行逐字节复制break;}return ret;}int main (){char s1[SIZE];char s2[SIZE]="hello123456789";printf("s1 = 0x%p\n",s1);printf("s2 = 0x%p\n",s2);MyStrcpy2(s1,s2);printf("s1 = %s\n",s1);return 0;}注意:上面的三种方法,如果输入两个连续的0都会造成程序奔溃,如输入"hello12300456"
原因:未知
0 0
- 关于字符串复制函数my_strcpy的三种方法
- 字符串的复制函数,用my_strcpy(char *s, const char *t)
- 【C语言】字符串操作函数my_strcpy
- my_strcpy,my_strcmp,my_strcat,my_strlen函数的实现
- 自定义字符串拷贝my_strcpy()
- 将字符串str1复制为字符串str2的三种方法
- 关于字符串的复制
- 函数实现my_strcpy.
- 【Linux C】关于遍历字符串的三种方法
- 复制文件的三种方法
- my_strcpy
- my_strcpy
- my_strcpy
- 字符串复制函数 strcyp 复制的原型
- 字符串复制函数的实现
- 常见的字符串复制函数
- 字符串函数模拟实现之strlen函数的三种常见实现方法
- 文件复制三种方法
- 第一章 综述
- 代码的有效性问题
- iOS项目中删除默认的并使用自建的ViewController后黑屏
- linux中mmap系统调用原理分析与实现
- HDU 1058 Humble Numbers
- 关于字符串复制函数my_strcpy的三种方法
- 开启本地服务器 Apache服务器
- 1.c/c++程序员面试宝典--基本数据类型
- [ahk]股票交易软件持仓数据获取--通达信测试可用(招商证券)
- 第二章 数组
- 有关nginx upstream的五种分配方式
- 第三章 简单排序
- android顶部导航栏的封装
- c++定义学生类