免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
51 [报告]
发表于 2007-08-06 09:07 |只看该作者
原帖由 快乐的土豆 于 2007-8-6 08:37 发表
在很大一部分函数返回0表示正常,负数表示异常情况下,strxxx的函数返回了dest反映的不过是原来的接口的设计人员考虑的不充分。

0表示正常,负数表示异常,这个只是在*nix系统调用中的返回值状况,而现在讨论的str×××函数都是标准库中的,标准库中的函数数绝大多数都不是返回0或负值的。

论坛徽章:
0
52 [报告]
发表于 2007-08-06 09:11 |只看该作者

晕。。。看来大家对C都不是很深入了解啊

为什么返回指针?
    答案:
            因为返回指针可以链式调用,使代码更美观。这个并不是随便设计的,C的库函数设计的每一步都有其意义。
    例子:
            strcpy(a,strcpy(b,c));你想想,如果返回的不是指针,那代码该有多丑。

论坛徽章:
0
53 [报告]
发表于 2007-08-06 09:11 |只看该作者
就这个面试题而言,是不是说返回dest指针是最好的方案或较优的方案呢?

1、能嵌套使用的确比较方便,速度也去快一点,但应该不明显,而从可维护性说,大量使用嵌套不是上好做法,经常还特意拆开增加可阅读性. (好不好,这个理由不充分)
2、strcpy本身就是不安全的,这类函数设计时本身就是假设调用者能确保其安全性,也许是考虑一些效率等其他因素。但如果返回0和-1或其它表示成功失败,是不是比返回dest好呢?因为在调用strcpy或strncpy是不知道成功与否的。讲究效率,也许只是个哲学问题。
3、还没想到

论坛徽章:
0
54 [报告]
发表于 2007-08-06 09:12 |只看该作者
原帖由 smltiger 于 2007-8-6 09:11 发表
为什么返回指针?
    答案:
            因为返回指针可以链式调用,使代码更美观。这个并不是随便设计的,C的库函数设计的每一步都有其意义。
    例子:
            strcpy(a,strcpy(b,c));你想想,如 ...


没看前面的讨论

论坛徽章:
0
55 [报告]
发表于 2007-08-06 09:14 |只看该作者
原帖由 smltiger 于 2007-8-6 09:11 发表
为什么返回指针?
     例子:
            strcpy(a,strcpy(b,c));你想想,如果返回的不是指针,那代码该有多丑。


不觉得分开写有多丑陋,
反而觉得很好阅读了。
你会不会觉得strcpy( a, strcpy (b, strcpy(c,d))); 更帅了 ?

论坛徽章:
0
56 [报告]
发表于 2007-08-06 09:15 |只看该作者
原帖由 M.I.X 于 2007-8-6 09:11 发表
2、strcpy本身就是不安全的,这类函数设计时本身就是假设调用者能确保其安全性,也许是考虑一些效率等其他因素。但如果返回0和-1或其它表示成功失败,是不是比返回dest好呢?因为在调用strcpy或strncpy是不知道成功与否的。讲究效率,也许只是个哲学问题。

strcpy的目的数组并不知道数组的长度,这个是没法返回是否成功的。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
57 [报告]
发表于 2007-08-06 09:19 |只看该作者
原帖由 快乐的土豆 于 2007-8-6 09:16 发表

没有错误是错误值是0的情况,就像没有返回值是返回值是void一样。

按你所说的,str*只能返回0,
即使数组越界。

论坛徽章:
0
58 [报告]
发表于 2007-08-06 09:20 |只看该作者
原帖由 快乐的土豆 于 2007-8-6 09:16 发表

没有错误是错误值是0的情况,就像没有返回值是返回值是void一样。

光就复制这个动作而言,是不会产生错误的,而strcpy又不会知道目的数组的大小,所以,即使越界了,strcpy也不会察觉,再说了,越界了进程就被内核直接kill掉了,而strcpy返回个0有什么意思?还不如直接用void,还少了条指令

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
59 [报告]
发表于 2007-08-06 09:25 |只看该作者
原帖由 快乐的土豆 于 2007-8-6 09:23 发表

我可没这么说,我只不过针对他说的strcpy永远不会出错这句话说的——假设真的永远不会出错,比如在申请内存失败的情况下也不算出错。

比如数组越界这种问题,应该算在c的编程传统上,在这个问题上,我什么 ...

strcpy没有什么内存可申请的吧?

论坛徽章:
0
60 [报告]
发表于 2007-08-06 09:26 |只看该作者
原帖由 smltiger 于 2007-8-6 09:11 发表
为什么返回指针?
    答案:
            因为返回指针可以链式调用,使代码更美观。这个并不是随便设计的,C的库函数设计的每一步都有其意义。
    例子:
            strcpy(a,strcpy(b,c));你想想,如 ...


strcpy(a,c)好像比你的更简洁呀
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP