理解基础strcpy

来源:互联网 发布:小楼昨夜又东风 知乎 编辑:程序博客网 时间:2024/04/29 07:20


strcpy经常用却没想过,今天遇到一题,如下:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
char *p1=“name”;
char *p2;
p2=(char*)malloc(20);
memset(p2, 0, 20);
while(*p2++ = *p1++);
printf(“%s\n”,p2);
}

运行结果你猜是什么。

结果是空,打印处就一换行。

其实这题很简单,p1和p2地址一直在增加,当遇到 \0时就复制结束,也就停在那里,即其指向了字符结尾处。虽然简单却容易犯错。

这一题明显有考strcpy的含义,于是就在网上搜strcpy源码是什么写的,显示如下:

1
2
3
4
5
6
char *strcpy(char *d,const char *s)
{
char *r = d;
while(*d++ = *s++);
return r;
}


看到源码于是又想问,这里不也是*d++吗,在外面打印是不是也会出现*d是不是也会出现空字符串呢,其实不是。

这里就用到作用域的概念,将strcpy写成一个单独的函数,其传递的参数是形参,即*r也是指向字符串的一个指针,不再是原来的指针,它只是改函数的局部变量而已,一旦strcpy函数执行完毕就消失了,所以大牛们没有写成这个样子,如下:

1
2
3
4
5
6
char *strcpy(char  *d,const char *s)
{
char *r = d;
while(*r++ = *s++);
return d;
}


至此,写完了,总结一下,大牛们写的函数都是很经典的,膜拜啊.....



原创粉丝点击