// 字符串拷贝.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <assert.h>
#define CONTAIN_OF_ZERO_BYTE(n) \
(((n - 0x01010101) & (~n)) & 0x80808080)
#define TEST(n) (((n - 1) & (~n)) & 0x80)
#if 0
n = 0 -> 0xFF & 0xFF = 0xFF // 只有0满足:1、减一等于0xFF;2、取反等于0xFF
n = 1 -> 0x00 & 0xFE = 0x00
n = 2 -> 0x01 & 0xFD = 0x01
#endif
char* mystrcpy1(char* dest, const char* src)
{
assert(dest != NULL && src != NULL);
char* p = dest;
while (*dest++ = *src++);
return p;
}
char* mystrcpy2(char* dest, const char* src)
{
assert(dest != NULL && src != NULL);
char* p = dest;
int delta = dest - src;
while (*(char*)(src + delta) = *src++);
return p;
}
char* mystrcpy3(char* dest, const char* src)
{
assert(dest != NULL && src != NULL);
int* s ;
int* d ;
char* p = dest;
s = (int*)src;
d = (int*)dest;
while (1)
{
if (!CONTAIN_OF_ZERO_BYTE(*s))
{
*d++ = *s++;
continue;
}
src = (char*)s;
dest = (char*)d;
while (*dest++ = *src++); // 这个循环最多执行四次
break;
}
return p;
}
char s1[16];
int main(int argc, _TCHAR* argv[])
{
char s2[16] = "hello123456789";
mystrcpy3(s1, s2);
printf("s1 = %s\n", s1);
return 0;
}
strcpy 的实现
最新推荐文章于 2019-11-12 17:47:15 发布