红联Linux门户
Linux帮助

Linux应聘常考题: C中的strcpy()函数

发布时间:2006-08-19 00:06:11来源:红联作者:莫奕
很多公司用这个函数考察应聘者的一些技能,如代码风格、代码成熟度等。

首先要避免国内一些教科书的误导的诸如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 */

014 char *

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

016 {

017 register char c;

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

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

020 size_t n;

021 do {

022 c = *s++;

023 s[off] = c;

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

025 n = s - src;

026 (void) CHECK_BOUNDS_HIGH (src + n);

027 (void) CHECK_BOUNDS_HIGH (dest + n);

028 return dest;

029 }

030

要注意的有:

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

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

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

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

5、第026行为什么要返回void类型;

如果你这些都已经很熟悉了,我相信没有公司可以立即拒绝你。

有问题大家探讨,一起学习成长。
文章评论

共有 1 条评论

  1. zav 于 2006-08-19 15:25:13发表:

    laoda,
    (__builtin_trap (),

    ptrdiff_t

    *__unbounded
    的定义在哪儿?