c语言学习零碎整理(8):看一个标准的库函数是怎么写的

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语言了。看一遍就有一些新的收获,温故而知新啊。所以记下来,别再忘了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值