首先讲讲strcpy的源码,它是三者中最简单的,但是确实最为精辟的
char * __cdecl strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ )
; /* Copy src over dst */
return( dst );
{
char * cp = dst;
while( *cp++ = *src++ )
; /* Copy src over dst */
return( dst );
}
代码只有这么几行,如果你说你看懂了,其实我是肯定是相信的,但是如果你真的真的看懂了,那说明你对编译原理的了解还真的是有点,为什么我这么说呢,尽管代码只有这么几行,但是可谓是精辟,首先我们来了解一下char*a的构造问题,所有cha*数组都是有自己的起始位置,但是其终结位置是有/0来标记的,想必很多同学都是知道的,如果char a[100]是一个100个char的数组但是真正填写有意义的字符只有99个,因为最后一位是/0字符来标记最后一位,告诉你现在是结束位置哦!理解这个是理解三个函数的源码基础,再看看上述代码 while( *cp++ = *src++ );
这个一个空while循环,判断条件即是功能执行块(经典之一),这个时候不知道你自己是否有一个疑问,这个执行就不需要任何其他判断条件吗?比如src和dst的长度问题,是否可以做到全复制呢?(这是经典之二)
我来细细说下哦,假设char * src比char * dst长度要长,即char * src = aaaaaaaaaa/0 ,char *dst = bbbbb/0 那么复制之后 dst变为aaaaaaaaaa/0这可以实现了src复制到dst上。相反如果char * a = aaaaa/0, char * dst = bbbbbbbbbb/0,则复制之后char * dst = aaaaa/0bbb/0(/0也占一个字符)尽管dst变成这么长但是其实上,dst=aaaaa/0=a(因为char数组遇到第一个/0就意味了结束了)所以也是能够实现复制操作,尽管没有比较,但是如果犀利的一行代码就可以做到复制,实在厉害!!(我觉得这行代码可谓是经典中的经典了,尽管很简单但是很是精髓,我们慢慢体会啊)接下来的两段代码有了这个基础想必理解就是要轻松多了,我明白你们一定可以的。
strncpy的源码(此函数就是在实现n的赋值,这个肯定会有判断的,亲)
char * __cdecl strncpy ( char * dest, const char * source, size_t count )
{
char *start = dest;
while (count && (*dest++ = *source++)) /* copy string */
count--;
if (count) /* pad out with zeroes */
while (--count)
*dest++ = '\0';
return(start);
}
{
char *start = dest;
while (count && (*dest++ = *source++)) /* copy string */
count--;
if (count) /* pad out with zeroes */
while (--count)
*dest++ = '\0';
return(start);
}
memcpy的源码(这个相当于什么都可以copy)
void*memcpy(void*dest, constvoid *src, size_tcount)
{
assert(dest != NULL && src != NULL);
char*tmp = dest;
constchar *s = src;
while(count--)
*tmp++ = *s++ ;
returndest;
}