字符串拷贝算法

简介

李明老师的C语言中级课程中,讲解了这一算法,无奈记性不好。。为了以后能时常看到,现记录下来。 函数原型为:

1
strcpy( char *dest, char *src )

简单方法

核心代码:

1
while( *dest++ = *src++ );

增量值算法

因为dest和src存储位置相邻,与其每次访问dest和src两个地址,不如只访问src所指存储空间,核心代码如下:

1
2
int delta = dest - src;
while(*(char *)(src + delta)++ = *src++);

每次复制4个字节算法

因为在32操作系统下,每次复制32位字符串,会大大地提高效率。核心代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
int * d = (int *)dest;
int * s = (int *)src;
while(1) {
if(!CONTAIN_OF_ZERO_BYTE(*s)) {
* d = * s;
d++, s++;
continue;
}
src = s;
dest = d;
while( *dest++ = *src++ ); //最多执行4次
}

上述的那个宏很重要,可以判断一个字节中是否含有‘\0’,因为字符串复制遇到’\0’就可以结束了。

1
2
#define TEST(n) (((n - 1) & (~n)) & 0x80)  // 为0时返回真
#define CONTAIN_OF_ZERO_BYTE(n) (((n - 0x01010101) & (~n)) & 0x80808080) //只要字节中含有0即返回真