strcpy函数写法

很多公司用这个函数考察应聘者的一些技能,如代码风格、代码成熟度等。


首先要避免国内一些教科书的误导的诸如while(*dest++=*src++)这样的代码。


  我把参考写法如下(纯C代码):


  000


  001# include


  002


  003# define BOUNDS_VIOLATED (__builtin_trap (), 0)


  004


  005# define CHECK_BOUNDS_LOW(ARG)\


  006(((__ptrvalue (ARG) < __ptrlow (ARG)) && BOUNDS_VIOLATED),\


  007__ptrvalue (ARG))


  008


  009# define CHECK_BOUNDS_HIGH(ARG)\


  010(((__ptrvalue (ARG) > __ptrhigh (ARG)) && BOUNDS_VIOLATED),\


  011__ptrvalue (ARG))


  012


  013/* copy src to dest */


  014char *


  015strcpy ( char *dest, const char *src)


  016{


  017register char c;


  018char *__unbounded s = (char *__unbounded) CHECK_BOUNDS_LOW (src);


  019const ptrdiff_t off = CHECK_BOUNDS_LOW (dest) - s - 1;


  020size_t n;


  021do {


  022c = *s++;


  023s[off] = c;


  024} while (c != '\0');


  025n = s - src;


  026(void) CHECK_BOUNDS_HIGH (src + n);


  027(void) CHECK_BOUNDS_HIGH (dest + n);


  028return dest;


  029}


  030


  要注意的有:


  1、第003行宏调用的函数为指针越界陷阱系统调用(bounds check,即int $5);


  2、第006行的‘&&’和‘,’符号在宏中的用法;


  3、数据类型的定义,诸如ptrdiff_t, size_t等的使用;


  4、第023的s指针为什么高效,如寄存器使用数量是最少的;


  5、第026行为什么要返回void类型;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值