直接来源码:
#incude <stdio.h>
char *strcpy(char *dst, const char *src)
{
if(dst == NULL || src == NULL)
return;
char *dstFirst = dst;
while( (*dst ++ = *src ++) != '\0');
return dstFirst;
}
int getLen(const char *str) //计算字符串长度,相当于strlen
{
int n = 0;
while(*str++ != '\0')
n++;
return n;
}
//测试部分
void main()
{
char testSrc[] = "zijuezizhi";
char testDst[20];
strcpy(testDst, testSrc);
printf("%s\n", testDst);
}
有几点探讨一下:
1,
while( (*dst ++ = *src ++) != '\0');
关于这句话的执行顺序问题,将*src的值赋给左边的*dst,然后判断*dst是否等于'\0',如果不等于,则dst++,src++,即指针指向下一字符。参考http://topic.csdn.net/u/20120217/19/c6341524-4be1-4ddc-b3f3-96802f137f4a.html《C程序设计语言》第二版 K&R 机械工业出版社 2.10
赋值运算符与表达式:赋值表达式的类型是它的左操作数的类型,其值是赋值操作完成后的值。
现在的问题是,当程序跳出后,src究竟指向哪?也就是当*src = '\0'时,还执行src++ dst++吗?这个问题答案参见我后来写的http://blog.csdn.net/yanzi1225627/article/details/7843672
因此和"\0"比较的是赋值结束后的值,这里究竟是*dst还是*src,姑且认为是*dst吧!有知道的大神赐教下....当执行到最后,*src='\0'时,将'\0'赋给左边的,然后才比较结束。也就是strcpy这个函数,不仅赋值,而且把字符串结束副业赋了过去。
2,注意srcpy这个函数,里面的dst是要求预先申请类存的。char testDst[20]可以写成char testDst[strlen(testSrc) + 1],也可以写成char testDst[sizeof(testSrc)],如果这点有疑惑可以看我的第一篇帖子http://blog.csdn.net/yanzi1225627/article/details/7838877。
也可以写成char *testDst = malloc(sizeof(testSrc))或者malloc(strlen(testSrc)+1),来申请内存。
但是如果 char *testSrc = "zijuezizhi",则只能借助strlen来确定内存大小。