char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘/0’ )
;
return address;
}
注意的地方:
1,const char *strSrc 因为strSrc是输入参数,不能被修改。
2,assert的使用。头文件加上include<assert.h>。对源地址和目的地址加非0断言,加强程序的健壮性。如果strDest 或者strSrc为空指针,那么系统会提示:Assertion failed,并指出出错位置。
3,用了一个变量address。是为了实现链式操作,将目的地址返回。比如strcpy( s,strcpy(t,a) );把a的内容复制给t,再把t的内容复制给s。
4,while( (*strDest++ = * strSrc++) != ‘/0’ )。根据优先级,先把strSrc所指内存的值赋值到strDest所指的内存中,然后strSrc指向下一块内存,strDest也一样。直到遇到'/0'为止。此时,*strDest和*strSrc的值都为'/0'。
我自己写了一个程序,用来验证这个函数。但却犯了一个错误。后来看了一下自己以前的笔记才发现错误的原因。贴出来,看你能看到错误在哪里吗?
#include<stdio.h>
#include<assert.h>
char *strcopy(char *strDest, const char *strSrc);
main()
{
char *s = "moonbingbing";
char *t = "wenming";
strcopy(s,t);
printf("%s/n%s/n",s,t);
return 0;
}
char *strcopy(char *strDest, const char *strSrc)
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != '/0' )
;
return address;
}
错就错在char *s = "moonbingbing";char *t = "wenming";
因为在ANSI C中,指针p 指向的字符串是当作常量来处理的。如果你的编译器是tc2.0 ,tc++3.0 ,wintc,那么编译器不会报错。从这个程序可以看出,写一个程序不难,但写好就容易了。这些库函数都是高手们写的,要考虑健壮性,安全性,扩展性。这就是高手和和一般人的区别了。
这些东西在林锐的书上见过,有一段时间没温习c语言了。看一遍就有一些新的收获,温故而知新啊。所以记下来,别再忘了。