免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: M.I.X
打印 上一主题 下一主题

[函数] 曾面试时被问:strcpy函数为什么要返回指针? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2007-08-07 16:38 |显示全部楼层
原帖由 思一克 于 2007-8-7 16:28 发表
哪有返回末尾的?返回dest.

GLIBC的代码是一定是千锤百炼的。因为是给无数应用做基础的。


哦?
我没用过那个函数,我只是猜的。
不过,如果返回的不是末尾的话,
  1. strcpy (stpcpy (stpcpy (fullname, fname), "/"), locnames[cnt]);
复制代码

岂不是等效于 strcpy( fullname, locnames[cnt] ) ?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
12 [报告]
发表于 2007-08-07 16:41 |显示全部楼层
  1. flw@Sleeper:~$ man stpcpy 2>/dev/null | grep -A 5 RETURN
  2. RETURN VALUE
  3.        stpcpy() returns a pointer to the end of the string dest (that is,  the
  4.        address of the terminating null byte) rather than the beginning.

  5. CONFORMING TO
  6.        This  function  is  not  part of the C or POSIX.1 standards, and is not
  7. flw@Sleeper:~$
复制代码

返回的是末尾。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2007-08-07 16:44 |显示全部楼层
> GLIBC的代码是一定是千锤百炼的。因为是给无数应用做基础的。
glibc 的代码是给应用程序用的是不假,
但是这段代码的风格的确很糟糕。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
14 [报告]
发表于 2007-08-07 17:08 |显示全部楼层
原帖由 思一克 于 2007-8-7 16:59 发表
什么系统上? return end of dest?



NAME
       strcpy, strncpy - copy a string

SYNOPSIS
       #include

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

       char *strncpy(cha ...

你举的例子是 stpcpy,不是 strcpy。
看,你也晕了吧?
这就充分说明它那个风格很不好,很容易把人看晕。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
15 [报告]
发表于 2007-08-07 17:24 |显示全部楼层
原帖由 思一克 于 2007-8-7 17:16 发表
例子晕了,前面的例子还没有晕呀。

dest无非就是函数的“计算”结果,不返回它返回什么?和其他strXXX函数一起看,返回dest太自然不过的了。

我没有说返回 dest 不自然。
我尊重这种做法。
但是我认为不返回也没什么,
我的观点是返回也行,不返回也行,即不讨厌返回,也不认为一定要返回。
但是有一点我想说的是:
绝对不能为了证明 strcpy 的返回值不是个蛇足而提倡类似于 strcpy( strcpy( strcpy ... ) ) ) 的做法,
我认为在一个代码行里做两件或者两件以上的事是非常糟糕的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2007-08-07 17:28 |显示全部楼层
原帖由 福瑞哈哥 于 2007-8-7 17:26 发表

那Lisp基本上可以说是基于这种技术啊,一个函数的返回是另外一个函数的输入。

函数式编程语言并不存在“调用”的关系,因此并不存在谁是谁的输入。
当然了,Lisp 我没学过,据了解 Lisp 不是很纯的函数式编程语言,因此概念上借鉴过程语言也许是有的。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2007-08-07 17:36 |显示全部楼层
原帖由 思一克 于 2007-8-7 17:29 发表
to flw,
也基本同意你说的。
但C的函数设计也是考虑的十分周到的。
无非是让一个函数有一个结果返回。因为C中函数是为主的,过程归类函数。

strcpy(buf, "12345")[0] = 'A';
strcat(strcpy(buf, "1234 ...

我老早以前就已经说过了,我的理解是:
反正返回了也可以不用,
而不返回就想用都用不着

因此返回其实是一种兼容了不返回的做法——对于那些喜欢不返回的人来说,你就把 strcpy 当作不返回好了,它又不妨碍你什么(也基本上不会带来性能上的损失)。
所以,我可以包容返回一个值,而且这样可以让它和别的函数看上去更统一一些,何乐而不为呢?
但是如果非要一棍子打死,
认为一定要不返回了才好,再或者不返回就不对了,
那就有点儿非理性了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP