不调用库函数,实现字符串复制函数char * strcpy(char * dst, const char * src) C/C++软件开发求职面试题 必备考点(二)

直接来源码:

#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来确定内存大小。

你可能感兴趣的:(c/c++)