曾面试时被问:strcpy函数为什么要返回指针?

时间:2008-01-16 11:13:48  来源:  作者:

我答:可以不返回, 函数就这么设计的.:em06: :em06:








 unixpm 回复于:2007-08-05 13:43:34

好好看看林博士的高质量,呵呵


 M.I.X 回复于:2007-08-05 13:48:02

是啊,返回指针可以嵌套使用
只是觉得这个问题
有点......:em06:
所以就这么答了.
汗一下自己

[ 本帖最后由 M.I.X 于 2007-8-5 13:49 编辑 ]


 flw 回复于:2007-08-05 14:23:33

这个问题应该这样回答:
如果不返回指针的话,你就又会问我“为什么 strcpy 函数不返回指针?”,因此它只好返回指针了。


 MMMIX 回复于:2007-08-05 14:28:16

引用:原帖由 flw 于 2007-8-5 14:23 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160195&ptid=971962]
这个问题应该这样回答:
如果不返回指针的话,你就又会问我“为什么 strcpy 函数不返回指针?”,因此它只好返回指针了。 


:mrgreen: :mrgreen: :mrgreen:


 MMMIX 回复于:2007-08-05 14:29:48

引用:原帖由 M.I.X 于 2007-8-5 13:48 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160073&ptid=971962]
是啊,返回指针可以嵌套使用
只是觉得这个问题
有点......:em06:
所以就这么答了.
汗一下自己 


本来就是那样,当时就那么设计了,未必有多少深奥的不得了的道理 :em10:


 cugb_cat 回复于:2007-08-05 14:44:07

引用:原帖由 M.I.X 于 2007-8-5 13:48 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160073&ptid=971962]
是啊,返回指针可以嵌套使用
只是觉得这个问题
有点......:em06:
所以就这么答了.
汗一下自己 


很多函数都是这样设计的,理由也就是这个理由。


 cviolet 回复于:2007-08-05 14:45:02

引用:原帖由 flw 于 2007-8-5 14:23 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160195&ptid=971962]
这个问题应该这样回答:
如果不返回指针的话,你就又会问我“为什么 strcpy 函数不返回指针?”,因此它只好返回指针了。 


flw实在是太有才了,如果我心有不服的话,我的大脑又会问我“为什么你还心存不服?”,因此也就服了。


 flw 回复于:2007-08-05 14:47:41

引用:原帖由 cviolet 于 2007-8-5 14:45 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160259&ptid=971962]
如果我心有不服的话,我的大脑又会问我“为什么你还心存不服?”,因此也就服了。 


你以为我那句话是调侃?
那你错了。

事实上你模仿的这句话模仿得一点儿都不像。


 cviolet 回复于:2007-08-05 14:55:23

引用:你以为我那句话是调侃?
那你错了。 



事实上你那句话就是调侃,如果不是,那当然就是算我错了。


 mik 回复于:2007-08-05 15:05:13

引用:原帖由 cviolet 于 2007-8-5 14:55 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160285&ptid=971962]


事实上你那句话就是调侃,如果不是,那当然就是算我错了。 



事实上是你道行不够。他那句话确实不是调侃。可以返回何不返回。


 cviolet 回复于:2007-08-05 15:12:11

引用:事实上是你道行不够。他那句话确实不是调侃。可以返回何不返回。 

我尚未入道,岂敢谓行?
"可以返回何不返回?"  版主,人家问的问题意思是“为何要返回指针,目的何在?”
哎,就是调侃!包括题目本身亦属调侃!

[ 本帖最后由 cviolet 于 2007-8-5 15:15 编辑 ]


 mik 回复于:2007-08-05 15:21:07

引用:原帖由 cviolet 于 2007-8-5 15:12 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160326&ptid=971962]

我尚未入道,岂敢谓行?
"可以返回何不返回?"  版主,人家问的问题意思是“为何要返回指针,目的何在?”
哎,就是调侃!包括题目本身亦属调侃! 



尚未入道,又怎么明白呢。你认为调侃就调侃吧。


 cviolet 回复于:2007-08-05 15:26:39

引用:尚未入道,又怎么明白呢。你认为调侃就调侃吧。 


:em06: :em06: 看来还是潜水看贴好些:lol: :lol:


 思一克 回复于:2007-08-05 18:30:47

FUNCTION的设计一般都是取输入参数,计算后返回结果.
有时候,结果也在参数中(也是输入),虽然可以不返回.

然而不返回有些浪费了FUNCTION的能力,还引起使用他们的函数效率低下.
比如
[CODE]
char buf[128];
char *func1()
{
    return strcpy(buf, "123");
}
char *func2()
{
    strcpy(buf, "123");
    return buf;
}
[/CODE]

func2 效率低于func1.

所以返回是应该的.
既然要返回,那么一定返回dest, 因为dest是结果. 不可能返回src.


 fcloudf 回复于:2007-08-05 19:12:39

:shock: :shock: :shock:


 antigloss 回复于:2007-08-05 19:43:20

引用:原帖由 思一克 于 2007-8-5 18:30 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160650&ptid=971962]
func2 效率低于func1.

所以返回是应该的.
既然要返回,那么一定返回dest, 因为dest是结果. 不可能返回src.


何以见得 fun2 效率低于 fun1 呢?

[ 本帖最后由 antigloss 于 2007-8-5 19:44 编辑 ]


 思一克 回复于:2007-08-05 20:12:18

gcc test.c -S -c -o 1111

然后你看文件1111可以看到2个FUNCTION的汇编. 如果func2 比func1大就见得了.


引用:原帖由 antigloss 于 2007-8-5 19:43 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160816&ptid=971962]

何以见得 fun2 效率低于 fun1 呢? 




 yg 回复于:2007-08-05 20:30:51

也不见得一定要返回首指针。字符串有两个属性,首指针和长度。所以,我在写字符串处理函数时,喜欢返回长度。可以想象一下,连续strcpy和strcat,效率会差很多。


 cugb_cat 回复于:2007-08-05 20:35:13

引用:原帖由 思一克 于 2007-8-5 18:30 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160650&ptid=971962]
FUNCTION的设计一般都是取输入参数,计算后返回结果.
有时候,结果也在参数中(也是输入),虽然可以不返回.

然而不返回有些浪费了FUNCTION的能力,还引起使用他们的函数效率低下.
比如

char buf[128];
char ... 


这个感觉还是蛮对的


 思一克 回复于:2007-08-05 21:00:50

长度不是strcpy的结果. 而且长度是strcpy本身不关心和不知道的(除非你自己写一个strcpy).

还有,memcpy, strcat, strcpy, strncpy, memset, ....... 一系列都返回dest. 目的应该都是一样的.

引用:原帖由 yg 于 2007-8-5 20:30 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160965&ptid=971962]
也不见得一定要返回首指针。字符串有两个属性,首指针和长度。所以,我在写字符串处理函数时,喜欢返回长度。可以想象一下,连续strcpy和strcat,效率会差很多。 




 JohnBull 回复于:2007-08-05 21:22:03

引用:原帖由 思一克 于 2007-8-5 18:30 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7160650&ptid=971962]
FUNCTION的设计一般都是取输入参数,计算后返回结果.
有时候,结果也在参数中(也是输入),虽然可以不返回.

然而不返回有些浪费了FUNCTION的能力,还引起使用他们的函数效率低下.
比如

char buf[128];
char ... 



效率差不多吧?
不就差一条movl指令吗?


 思一克 回复于:2007-08-05 21:33:00

TO JOHNBULL,

[没有事情,上来看看.你也没有休息?]

一共就几条指令,差一条就有不小影响. 如果strcpy是在循环中大次数调用,差别就大了.

还有,返回dest可以这样调用:

last_str = strcat(strcpy(buf, "1283983983983"), strcat(strcpy(buf1, "aasdfiiioioaoisfioasfio"), "AAAASFDKKBKBKK"));

strXXXX大都返回dest. 如果不是, 那就不好写了, 效率也会低更多.


 antigloss 回复于:2007-08-05 21:36:49

那么,strcpy 没有返回值(void strcpy)和有返回值(char *strcpy)的效率差异呢?你计算了吗?

引用:
last_str = strcat(strcpy(buf, "1283983983983"), strcat(strcpy(buf1, "aasdfiiioioaoisfioasfio"), "AAAASFDKKBKBKK"));


这种写法的可读性太差了点吧

[ 本帖最后由 antigloss 于 2007-8-5 21:37 编辑 ]


 思一克 回复于:2007-08-05 21:39:44

如果void strcpy(),那么上面的表达方式就要分开写. 差别就更多了.

你可以自己实验,用一个整体的和分开的,看差多少语句


引用:原帖由 antigloss 于 2007-8-5 21:36 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161133&ptid=971962]
那么,strcpy 没有返回值(void strcpy)和有返回值(char *strcpy)的效率差异呢?你计算了吗? 




 mik 回复于:2007-08-05 21:41:14

效率并不主要的原因,况且返不返回效率确实几乎没什么差别。


 思一克 回复于:2007-08-05 21:44:32

知道你的意思了.

主要是接口要统一.又要方便调用者. FUNCTION返回结果是最正常不过的了.能返回的WHY NOT?
而且,返回又带来无数的方便(使FUNCTION成为复杂表达式的一部分). 如果没有返回,就麻烦了.



引用:原帖由 antigloss 于 2007-8-5 21:36 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161133&ptid=971962]
那么,strcpy 没有返回值(void strcpy)和有返回值(char *strcpy)的效率差异呢?你计算了吗?


这种写法的可读性太差了点吧 




 antigloss 回复于:2007-08-05 21:44:47

引用:原帖由 思一克 于 2007-8-5 21:39 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161139&ptid=971962]
如果void strcpy(),那么上面的表达方式就要分开写. 差别就更多了.

你可以自己实验,用一个整体的和分开的,看差多少语句


 


我的意思是,如果 strcpy 返回 char *,那么要比 void 多些语句吧,那么有返回值的 strcpy 效率要低于没有返回值的 strcpy 了吧?这又该怎么算呢?


 思一克 回复于:2007-08-05 21:52:58

知道你的意思了.

strcpy是低层的经过优化的库FUNC(汇编写的). 而CALLER是用户自己写的. 效率方面如果有差别, 用户程序影响更大.

主要还不是考虑效率.

FUNC有返回数值才是正常的, 才可以将FUNC作为表达方式的一部分,或一STATMENT的一部分.

除了我上面例子,还有

printf("%s %d %sn", strcpy(buf, buf1), 1, str(buf3, buf3));

如果void strcpy, 就麻烦了.

总而言之,FUNC应该返回自己的计算结果(除非结果很大是一个比如结构). 能返回的,一定不要void. 尤其是库FUNC.



引用:原帖由 antigloss 于 2007-8-5 21:44 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161154&ptid=971962]

我的意思是,如果 strcpy 返回 char *,那么要比 void 多些语句吧,那么有返回值的 strcpy 效率要低于没有返回值的 strcpy 了吧?这又该怎么算呢? 




 思一克 回复于:2007-08-05 22:03:39

copy了string实际是FUNCTION的副作用. (function's side effect). 
正作用就是返回dest. 使计算结果可以立即运用于表达式.


 flw2 回复于:2007-08-05 22:14:52

last_str = strcat(strcpy(buf, "1283983983983"), strcat(strcpy(buf1, "aasdfiiioioaoisfioasfio"), "AAAASFDKKBKBKK"));

strXXXX大都返回dest. 如果不是, 那就不好写了, 效率也会低更多.

其实效率已经没有了,copy在往上cat,不就做两遍了吗
我觉得就是方便而已,我看过一些代码,但是很少用到strcpy的返回值。 好像用strcpy的都不多,memcpy倒是很多


大家都真的用到strcpy的返回值吗


 flw2 回复于:2007-08-05 22:17:01

函数的返回值多一个或几个指令,但是也不至于用这个节省时间吧。程序中通常可能会复制一个大串,而不是频繁的复制一个小串吧


 cjaizss 回复于:2007-08-05 22:22:17

答案应该是,可以实现所谓的函数调用套函数调用。
反正就tmd一垃圾面试题,面试的时候我要是碰到这种题目,那么这样的面试官我势必是要找个机会羞辱一番。


 思一克 回复于:2007-08-05 22:24:29

主要还不是考虑效率.

FUNC有返回数值才是正常的, 才可以将FUNC作为表达方式的一部分,或一STATMENT的一部分.

除了我上面例子,还有

printf("%s %d %sn", strcpy(buf, buf1), 1, str(buf3, buf3));

如果void strcpy, 就麻烦了.

总而言之,FUNC应该返回自己的计算结果(除非结果很大是一个比如结构). 能返回的,一定不要void. 尤其是库FUNC.

copy了string实际是FUNCTION的副作用. (function's side effect). 
正作用就是返回dest. 使计算结果可以立即运用于表达式. 比如strcpy(buf, "12345")[1] = 'B';
等等.


 ypxing 回复于:2007-08-05 22:51:08

他们设计接口的时候,估计考虑效率方面会少一些,因为只是设计接口而不是实现
这样的接口主要还是为了能够函数调用套函数调用


 yulc 回复于:2007-08-05 23:03:12

引用:原帖由 cjaizss 于 2007-8-5 22:22 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161336&ptid=971962]
答案应该是,可以实现所谓的函数调用套函数调用。
反正就tmd一垃圾面试题,面试的时候我要是碰到这种题目,那么这样的面试官我势必是要找个机会羞辱一番。 




我觉得它本身是很好的一道题,只是现在用滥了而已.
我想第一个考人家这道题的人,现在觉得很恶心.


 flw 回复于:2007-08-05 23:10:25

这是一种哲学。
基于两种思想:
1,返回值和不返回值效率相差无几。
2,返回了值,可以不用它(返回值),也可以用它。想不用,就不用,想用,也可以,给了用户更多的选择。
而如果不返回值,就只能选择“不用”了,因为你想用也用不着。
总而言之,就是[color=red]尽可能给用户更多的选择,因为你无法预期用户将来会如何使用你的程序[/color]
引用 Perl 界的一句谚语,就是“There is more than one way to do it”。

下面再举个例子:
在 C 或者 Perl 以及其它的一些语言中,赋值运算有返回值,并且该返回值可以参与其它运算。
比如我们经常见到的:
if ( (fp = fopen( "/path/to/foo", "r" )) == NULL ){
}
类似的语句,
就是利用了这一特性。
现在有许多“编程规范”明文禁止这种写法,认为可读性不好,本人也是非常支持的。
然而作为语言本身来讲,它提供这种功能,只是你可以不用它。
和 C/Perl 相反的例子是 Pascal、Basic、Python。
就拿 Python 来说,Python 的作者认为这种做法经常会造成把
if ( ret == -1 ){
}
误写为
if ( ret = -1 ){
}
之后,程序仍然能够继续运行、并且造成难以察觉的错误(类似的讨论本版已经有过多次,许多人提到他们采用把常量写左边的方法。然而,大家都是 C 程序员,因此早就适应了前述的哲学,因而从来没有人想到这其实是因为罪恶的赋值语句返回值造成的错误,-1 == ret 只是亡羊补牢)
在 Python 中,
if ( ret = -1 ) 就是错误的写法,是不能编译运行的,也自然就不会造成 BUG。
我个人非常赞许这一做法。

说到这里,就触摸到了不同哲学之间的冲突问题来了。
有些人认为,我们给用户提供更多的功能,更多的选择,然后由他们决定哪一种才是最好的。并据此进行取舍。
而另一些认为,我们应该仅仅给用户提供最优的功能,然后强制用户采用这种选择,从而避免因为过于自由而带来的各种问题。Python 的强制缩进便是如此:几乎所有的语言都在强调缩进所带来的弊端,然而很少有语言像 Python 这样激进。因此格式混乱的代码在各种语言中都能见到,相比起来 Python 代码就要整齐的多。(自然也就没有资格参加混乱代码大赛了 ^_^)


 woshiwo 回复于:2007-08-05 23:12:53

作为一个通用库的调用界面,良好的支持链式表达已经很充分了,无他


 whyglinux 回复于:2007-08-05 23:16:05

>> FUNCTION的设计一般都是取输入参数,计算后返回结果.
>> 有时候,结果也在参数中(也是输入),虽然可以不返回.
>> 总而言之,FUNC应该返回自己的计算结果(除非结果很大是一个比如结构). 能返回的,一定不要void. 尤其是库FUNC.

可见,经过讨论,对返回还是不返回前后观点发生了变化。

>> 然而不返回有些浪费了FUNCTION的能力,还引起使用他们的函数效率低下.
>> func2 效率低于func1.

要说明问题的话,这两个函数也只能说明的是:在 strcpy 返回目的指针的情况下,这两种不同的使用 strcpy 的方式可能会带来效率上的差别(在返回值优化非常普遍的今天,它们的实现其实是相等的),而不能说明你的上述命题正确,因为你的比较中不含 strcpy 返回 void 的情况。

即使你的意思是说 func2 中使用的是返回类型为 void 的 strcpy 函数,即使察看 func1 和 func2 的汇编代码发现 func2 比 func1 多了一条指令,也不能由此就说 func2 效率低于func1??别忘了此时的 strcpy 调用中 func1 中的要比 func2 中的多一条指令,所以综合起来它们的效率其实还是相等。

在实际的代码中,连续拷贝字符串的代码不多见,绝大部分的使用都是忽略 strcpy 函数的返回值的。如果从效率上来考虑它的实现,那么 strcpy 绝对不应该返回任何值,也就是说应该把函数的返回类型设置为 void。(C 是追求效率的语言,但对大多数应用来说,实际上 strcpy 的返回操作是多余的,我认为只能归结于历史原因。)

从上面的分析可以看出:strcpy 返回目的字符串的指针不是出于效率的考虑(恰恰相反,考虑效率的话应该返回 void 而不是多出一个返回操作),而是从易用性上考虑的??这样的实现容易实现字符串的连续拷贝,在某些情况下可能用起来比较方便而已。

>> 总而言之,FUNC应该返回自己的计算结果(除非结果很大是一个比如结构). 能返回的,一定不要void. 尤其是库FUNC.

再返回来看看这句话,就知道说得有些绝对了。其实,如果函数的一个参数是一个指针类型,再将此指针原值作为函数值返回的情况一般并不常见。


 flw 回复于:2007-08-05 23:18:23

引用:原帖由 woshiwo 于 2007-8-5 23:12 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161513&ptid=971962]
作为一个通用库的调用界面,良好的支持链式表达已经很充分了,无他 


而链式调用本身就是非常有争议的做法,
因此要不要支持链式调用,
也是值得商榷的。
我的主要观点参考楼上。


 woshiwo 回复于:2007-08-05 23:25:16

引用:原帖由 flw 于 2007-8-5 23:18 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161524&ptid=971962]

而链式调用本身就是非常有争议的做法,
因此要不要支持链式调用,
也是值得商榷的。
我的主要观点参考楼上。 



其实争论点已经很明确。
我个人意见:既然语言特性支持返回值作为表达式一部分,库的设计者就不能不考虑。除非在效率上特别要命的地方,对于设计者来说通用性是第一位的。


 TAW 回复于:2007-08-05 23:29:30

返回的内容可以有:
1、指针
2、复制的数量(int)
3、返回0表示正常完成,其他表示各种错误。
题目是不是应该这样理解,为什么返回指针而不是返回其他内容?
而不是这样理解:为什么要返回值而不是不返回值?


 flw 回复于:2007-08-05 23:31:25

引用:原帖由 woshiwo 于 2007-8-5 23:25 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161538&ptid=971962]

其实争论点已经很明确。
我个人意见:既然语言特性支持返回值作为表达式一部分,库的设计者就不能不考虑。除非在效率上特别要命的地方,对于设计者来说通用性是第一位的。 


我一直强调,兼收并蓄才是王道,
我们每个人都可以有自己的或者自己支持的观点,
但是我们一定要注意到这个世界上还有不同的观点存在,
而且要考虑到它们的合理性。

简单地来说,
如果要我来设计一套 API,
我也许会重新考虑,
要不要像 strcpy 这样做,
当然考虑的最终结果也许还是和 strcpy 一样,
但是考虑过和不假思索拍屁股(注)决定的还是有很大区别的。


注:还有一种说法是拍脑袋,甚至还有拍大腿的。


 woshiwo 回复于:2007-08-05 23:54:24

我已经深刻体会到这个世界上还有不同的观点存在,所以才说是个人意见。
我个人从没用到过strcpy的返回值,但我还是尽量让自己站到设计者的立场上考虑问题,想必这不是他们拍屁股或脑袋的结果。
再次声明,个人观点。


 mik 回复于:2007-08-06 00:04:12

:em11: LZ 的贴里干嘛贴一个图出来?大煞风景。


 flw 回复于:2007-08-06 00:04:38

引用:原帖由 woshiwo 于 2007-8-5 23:54 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161606&ptid=971962]
我已经深刻体会到这个世界上还有不同的观点存在,所以才说是个人意见。
我个人从没用到过strcpy的返回值,但我还是尽量让自己站到设计者的立场上考虑问题,想必这不是他们拍屁股或脑袋的结果。
再次声明,个人 ... 


:) :) :)


 woshiwo 回复于:2007-08-06 00:08:37

引用:原帖由 mik 于 2007-8-6 00:04 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161624&ptid=971962]
:em11: LZ 的贴里干嘛贴一个图出来?大煞风景。 


LZ认为,这是他理想中的返回值……


 langue 回复于:2007-08-06 01:06:20

既然有 assignment expressions,那为什么 strcpy() 不能在完成任务的时候带个指针出来?:)


 nully 回复于:2007-08-06 09:06:22

引用:原帖由 快乐的土豆 于 2007-8-6 08:37 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161851&ptid=971962]
在很大一部分函数返回0表示正常,负数表示异常情况下,strxxx的函数返回了dest反映的不过是原来的接口的设计人员考虑的不充分。 


strcpy不会产生错误,就像数组越界访问不会产生错误一样。

ps:我同意flw的看法,返回了就多了一种选择


 flw2 回复于:2007-08-06 09:06:59

看了几位高手的帖子,觉得以下几种观点都有一定得到里

1.历史原因
2.给用户这种选择,但是不强迫你用
3.完全是过时(没有必要)的接口
4.无妨(和2有点类似)

但是我个人确实很少见到利用strcpy的代码,虽然不能代表别人,但是我估计大多数人也不会用,一个功能99%的人都不用,不能说明它是没有用的,但至少说明没有它,我们基本不受影响。


 cugb_cat 回复于:2007-08-06 09:07:52

引用:原帖由 快乐的土豆 于 2007-8-6 08:37 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161851&ptid=971962]
在很大一部分函数返回0表示正常,负数表示异常情况下,strxxx的函数返回了dest反映的不过是原来的接口的设计人员考虑的不充分。 


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


 smltiger 回复于:2007-08-06 09:11:12

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


 M.I.X 回复于:2007-08-06 09:11:47

就这个面试题而言,是不是说返回dest指针是最好的方案或较优的方案呢?

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


 cugb_cat 回复于:2007-08-06 09:12:57

引用:原帖由 smltiger 于 2007-8-6 09:11 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161955&ptid=971962]
为什么返回指针?
    答案:
            因为返回指针可以链式调用,使代码更美观。这个并不是随便设计的,C的库函数设计的每一步都有其意义。
    例子:
            strcpy(a,strcpy(b,c));你想想,如 ... 


:em06: :em06: :em06: :em06: :em06: 
没看前面的讨论:em06: :em06: :em06:


 M.I.X 回复于:2007-08-06 09:14:39

引用:原帖由 smltiger 于 2007-8-6 09:11 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161955&ptid=971962]
为什么返回指针?
     例子:
            strcpy(a,strcpy(b,c));你想想,如果返回的不是指针,那代码该有多丑。



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


 cugb_cat 回复于:2007-08-06 09:15:20

引用:原帖由 M.I.X 于 2007-8-6 09:11 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161958&ptid=971962]
2、strcpy本身就是不安全的,这类函数设计时本身就是假设调用者能确保其安全性,也许是考虑一些效率等其他因素。但如果返回0和-1或其它表示成功失败,是不是比返回dest好呢?因为在调用strcpy或strncpy是不知道成功与否的。讲究效率,也许只是个哲学问题。


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


 lenovo 回复于:2007-08-06 09:19:58

引用:原帖由 快乐的土豆 于 2007-8-6 09:16 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161977&ptid=971962]

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


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


 cugb_cat 回复于:2007-08-06 09:20:51

引用:原帖由 快乐的土豆 于 2007-8-6 09:16 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161977&ptid=971962]

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


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


 lenovo 回复于:2007-08-06 09:25:39

引用:原帖由 快乐的土豆 于 2007-8-6 09:23 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7162015&ptid=971962]

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

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


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


 flw2 回复于:2007-08-06 09:26:34

引用:原帖由 smltiger 于 2007-8-6 09:11 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161955&ptid=971962]
为什么返回指针?
    答案:
            因为返回指针可以链式调用,使代码更美观。这个并不是随便设计的,C的库函数设计的每一步都有其意义。
    例子:
            strcpy(a,strcpy(b,c));你想想,如 ... 



strcpy(a,c)好像比你的更简洁呀


 cugb_cat 回复于:2007-08-06 09:27:21

引用:原帖由 flw2 于 2007-8-6 09:26 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7162040&ptid=971962]


strcpy(a,c)好像比你的更简洁呀 


效果不一样


 flw2 回复于:2007-08-06 09:28:53

strcpy(a.c);
strcpy(b,c);

可读性也不差。

就好比
a=b=c;


a=c;
b=c;

我觉得区别不大


 cugb_cat 回复于:2007-08-06 09:30:39

突然想到,strcpy返回值的设计是否也有为了遵循统一设计的需要?str类函数基本上都是返回指针的,象strchr之类的,只能返回指针,所以strcpy也就返回指针了,既然是返回嘛,当然返回目的。
有点象POSIX定义的函数,大多返回0或负值。


 lenovo 回复于:2007-08-06 10:00:13

引用:原帖由 快乐的土豆 于 2007-8-6 09:45 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7162156&ptid=971962]

我知道那个strcpy的源代码是直接在dest的后面增加,可能很不幸,src是如此的巨大(或者本身ram太小),且根据编译器的实现,恰好不会被dest的增长所覆盖,导致内存溢出崩溃。
这是我所能猜测的strcpy可能出错 ... 


抱歉,没看懂你的意思。


 lenovo 回复于:2007-08-06 10:14:40

引用:原帖由 快乐的土豆 于 2007-8-6 10:09 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7162254&ptid=971962]

dest可扩展的空间太小,src太大,这个肯定是要算做失败的。 


dest是你传入的参数,在调用的时候已经决定大小了,
可扩展是怎么回事?


 cugb_cat 回复于:2007-08-06 10:17:58

引用:原帖由 快乐的土豆 于 2007-8-6 10:09 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7162254&ptid=971962]

dest可扩展的空间太小,src太大,这个肯定是要算做失败的。 


就算是这样,strcpy又怎么得知dest的大小呢?


 lenovo 回复于:2007-08-06 11:15:46

引用:原帖由 快乐的土豆 于 2007-8-6 11:09 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7162543&ptid=971962]
可扩展的意思是:从c语言的角度来看,完全是可以这么strcpy的--不是编译错误(但是可能会抛出运行期错误).的确,看不到显式的内存申请语句,但是dest的确是需要更多的内存还容纳src--(这样c语言不认为是错误,反而认为 ... 


你能不能给一个小例子出来,
光看你说,我很晕。
我还是不知道你想表达什么意思。
c标准里规定了,如果dest的空间不够容纳
src的,那么行为是未定义的。
是不是你认为标准规定的不合理,
应改成:“如果dest的空间不够容纳
src的,应该能够自动扩展空间或者报告错误?”


 flw 回复于:2007-08-06 11:55:07

引用:原帖由 快乐的土豆 于 2007-8-6 11:52 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7162810&ptid=971962]
char c[4];
char b[4];
char a[8];
strcpy(a,"aaaaaaa");
strcpy(c,"c");
strcpy(b,a);
printf("a=%sn",a);
printf("b=%sn",b);
printf("c=%sn",c);

编译运行环境:vc6  window2003

毫无疑问,目前,在我们的机器上,这是一段能编译,运行的代码.
[color=red]而且大家都认为,这没有什么不妥.( )[/color]


不知道“大家”里面包括我吗?
如果包括我的话,你调查过我的意见吗?
我觉得,这非常不妥。


 思一克 回复于:2007-08-06 11:55:42

C的主要目的就是为了获得和汇编差不多的高效率,以适合系统程序设计。

如果自动扩展dest空间,也不复杂,进入函数时候用strlen(src), 再给参数dest_len, 不够自动扩展。但这样函数用户可以自己写,不能进入C库中。

能自动判断扩展的函数的效率一下就低的太多了--而用户自己保证不需要扩展可以获得高效率。

还有超长字符串(比如几十K以上)在一个写的好的C程序中没有。一行可以作为string, 一个文件就不能做。除非写程序的人故意做而不管程序的效率和技巧。



引用:原帖由 快乐的土豆 于 2007-8-6 11:09 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7162543&ptid=971962]
可扩展的意思是:从c语言的角度来看,完全是可以这么strcpy的--不是编译错误(但是可能会抛出运行期错误).的确,看不到显式的内存申请语句,但是dest的确是需要更多的内存还容纳src--(这样c语言不认为是错误,反而认为 ... 




 flw 回复于:2007-08-06 12:01:05

引用:原帖由 快乐的土豆 于 2007-8-6 12:00 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7162848&ptid=971962]

这种越界写的代码多如牛毛,很多c的教材里面都有(当然,我没法给出哪本教材里面的哪一段).


越说我越糊涂了,
难道这是一个很常用的技巧吗?


 M.I.X 回复于:2007-08-06 12:23:18

引用:原帖由 flw 于 2007-8-6 12:01 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7162854&ptid=971962]

越说我越糊涂了,
难道这是一个很常用的技巧吗? 



这个技巧也许不被用,但有时会被动的使用,
例如strcpy(dest, src) ;
char * src是其他类库函数返回的指针,当然这应该做临界判断,
但不做的话,就有可能覆盖后面空间了。


 lenovo 回复于:2007-08-06 12:46:58

吃完饭回来,发现有些帖子没了?


 flw 回复于:2007-08-06 12:51:43

引用:原帖由 lenovo 于 2007-8-6 12:46 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7163070&ptid=971962]
吃完饭回来,发现有些帖子没了? 


是快乐的土豆自己删除了自己的回复。


 lenovo 回复于:2007-08-06 12:52:34

引用:原帖由 flw 于 2007-8-6 12:51 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7163105&ptid=971962]

是快乐的土豆自己删除了自己的回复。 


晕,那还咋讨论呀。


 cugb_cat 回复于:2007-08-06 12:59:20

引用:原帖由 lenovo 于 2007-8-6 12:52 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7163108&ptid=971962]

晕,那还咋讨论呀。 


那就歇会吧:mrgreen: :mrgreen: :mrgreen: :mrgreen:


 net_robber 回复于:2007-08-06 13:56:53

引用:原帖由 flw2 于 2007-8-6 09:06 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161939&ptid=971962]
看了几位高手的帖子,觉得以下几种观点都有一定得到里

1.历史原因
2.给用户这种选择,但是不强迫你用
3.完全是过时(没有必要)的接口
4.无妨(和2有点类似)

但是我个人确实很少见到利用strcpy的代码, ... 


解析命令参数。并传递(复制)给结构体(比如name部分)

我觉得这个函数比较好


 Godbach 回复于:2007-08-06 14:13:38

学习了。。。


 meishu 回复于:2007-08-06 15:33:49

strcmp(...,strcpy(...,strcpy(....))) just like this


 yapand 回复于:2007-08-06 15:52:26

同意 flw 的观点。

对 python 的缩进印象很深。;)

ps 我记得 快乐的土豆 以前是做 java 的,现在转做 C 了?


 luojiannx 回复于:2007-08-07 00:35:55

我也从来没有用到过返回值

肯定是一个strcpy单独占一行

简单清晰最好,如果一行程序里面东西太多了,以后看程序的时候难免一不小心就看漏了

当然,这是个人风格问题,本人也没写过大程序,不知道别人怎么做的

我现在用php, 但骨子里头一直认为自己是属于C的

好久没来这里看过了,不管以后工作用不用的上,还是想学好C:mrgreen:


 pinyin 回复于:2007-08-07 10:32:32

引用:原帖由 smltiger 于 2007-8-6 09:11 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7161955&ptid=971962]
为什么返回指针?
    答案:
            因为返回指针可以链式调用,使代码更美观。这个并不是随便设计的,C的库函数设计的每一步都有其意义。
    例子:
            strcpy(a,strcpy(b,c));你想想,如 ... 


哥们,幽默


 ruoyisiyu 回复于:2007-08-07 10:59:17

敢问一句,人为什么要一天三餐,而不是一餐或是N餐


 flw2 回复于:2007-08-07 12:12:09

引用:原帖由 ruoyisiyu 于 2007-8-7 10:59 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7167513&ptid=971962]
敢问一句,人为什么要一天三餐,而不是一餐或是N餐 



这个好像没有什么好说的吧,习惯问题。不是所有人都一天3顿饭。
如果人们一天4顿,那么问题就变为,人们为什么一天吃4顿,而不是5顿或者122顿。


 yg 回复于:2007-08-07 12:56:56

这帖子还不沉啊,那就再说几句。
那个叫什么链式的,真是又难看,又不能提高效率。
如果是重载处理字符序列的,返回长度的好处是很多的。
其实,就是什么链式的,返回长度也是优于返回首指针的。

l = mystrcpy( d1, s );
memcpy( d2, s, l+1 );
memcpy( d3, s, l+1 );
...

在效率上最少也会有20-30%的提升,有的系统下会超过50%。
最关键的是,返回长度不需要额外开销。

size_t /*char * */
mystrcpy( char *des, char *src )
{
  char *p = des;

  while( *p++ = *src++ );

  return( p - des - 1 );  /* return( des ); */
}

一般来说,要找到字符串的首指针用一个指令就行了,而要找出字符串的长度,就需要很多指令,而且着些指令中还包含了大量的条件指令,会增加很多系统开销。
返回长度能提供的好处:
1、显著提高效率
2、保持以负数表示函数调用失败的方式
3、能处理不以''结束的字符序列,隔离函数实现细节(这在处理大字符流,而又不想写一个很长函数的时候是非常方便的)
而这只需要牺牲什么链式表达,值不值得只有你自己判断了。


 思一克 回复于:2007-08-07 13:01:37

其实这个问题通过以上讨论已经有结论了。

要将strXXX, memXXX系列函数许多都返回dest一起看。

dest指针在c中代表字符串本身。而长度不代表字符串,仅仅是他的一个属性。

系列函数返回计算结果(dest)是理所当然的。使得函数可以做为EXPRESSION的一部分。


 思一克 回复于:2007-08-07 13:07:06

在glibc 中(最精彩的C程序了,可以算是)

strcpy (stpcpy (stpcpy (fullname, fname), "/"), locnames[cnt]);

有许多。

我们平时很少用,不代表没有用。


 maersi 回复于:2007-08-07 13:22:14

算长知识了,也确实开眼了,美女好PP。


 yg 回复于:2007-08-07 15:27:40

这么简单的东西,一个sprintf就能完成,却写得如此晦涩,效率又低。这样的程序拿来玩玩还可以,没必要推崇。离最精彩的更是相去甚远。如果我的程序员在项目里这么写,挨批是免不了的。
而且stpcpy是非标的,返回的是字符串尾,和返回字符串本身风马牛不相及,这个函数的产生也说明,他的作者对strcpy返回字符串首指针是不赞同的。


 raul_xu_sercomm 回复于:2007-08-07 15:30:48

:em02: :em02:


 思一克 回复于:2007-08-07 15:36:15

返回串尾?


引用:原帖由 yg 于 2007-8-7 15:27 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7168908&ptid=971962]
这么简单的东西,一个sprintf就能完成,却写得如此晦涩,效率又低。这样的程序拿来玩玩还可以,没必要推崇。离最精彩的更是相去甚远。如果我的程序员在项目里这么写,挨批是免不了的。
而且stpcpy是非标的,返回 ... 




 flw 回复于:2007-08-07 15:37:54

引用:原帖由 思一克 于 2007-8-7 15:36 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7168968&ptid=971962]
返回串尾?
 


莫非你没注意到?:lol: :lol: :lol: 

BTW:GNU 的代码,垃圾的也有很多。
glibc 也是一样。
我觉得你贴出来的那段代码就很垃圾。


 思一克 回复于:2007-08-07 16:28:14

哪有返回末尾的?返回dest.

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

引用:原帖由 flw 于 2007-8-7 15:37 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7168985&ptid=971962]

莫非你没注意到?:lol: :lol: :lol: 

BTW:GNU 的代码,垃圾的也有很多。
glibc 也是一样。
我觉得你贴出来的那段代码就很垃圾。 




 flw 回复于:2007-08-07 16:38:42

引用:原帖由 思一克 于 2007-8-7 16:28 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7169323&ptid=971962]
哪有返回末尾的?返回dest.

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

 


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

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


 flw 回复于:2007-08-07 16:41:43

flw@Sleeper:~$ man stpcpy 2>/dev/null | grep -A 5 RETURN

RETURN VALUE
       stpcpy() returns a pointer to the end of the string dest (that is,  the
       address of the terminating null byte) rather than the beginning.

CONFORMING TO
       This  function  is  not  part of the C or POSIX.1 standards, and is not
flw@Sleeper:~$

返回的是末尾。


 flw 回复于:2007-08-07 16:44:55

> GLIBC的代码是一定是千锤百炼的。因为是给无数应用做基础的。
glibc 的代码是给应用程序用的是不假,
但是这段代码的风格的确很糟糕。


 思一克 回复于:2007-08-07 16:59:25

什么系统上? return end of dest?



NAME
       strcpy, strncpy - copy a string

SYNOPSIS
       #include <string.h>

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

       char *strncpy(char *dest, const char *src, size_t n);

DESCRIPTION
       The  strcpy() function copies the string pointed to by src (including the terminating `'
       character) to the array pointed to by dest.  The strings may not overlap, and the destina

RETURN VALUE
       The strcpy() and strncpy() functions return a pointer to the destination string dest.

[ 本帖最后由 思一克 于 2007-8-7 17:04 编辑 ]


 flw 回复于:2007-08-07 17:08:53

引用:原帖由 思一克 于 2007-8-7 16:59 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7169552&ptid=971962]
什么系统上? return end of dest?



NAME
       strcpy, strncpy - copy a string

SYNOPSIS
       #include 

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

       char *strncpy(cha ... 


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


 思一克 回复于:2007-08-07 17:16:41

例子晕了,前面的例子还没有晕呀。

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


 Edengundam 回复于:2007-08-07 17:21:28

引用:原帖由 yg 于 2007-8-7 15:27 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7168908&ptid=971962]
这么简单的东西,一个sprintf就能完成,却写得如此晦涩,效率又低。这样的程序拿来玩玩还可以,没必要推崇。离最精彩的更是相去甚远。如果我的程序员在项目里这么写,挨批是免不了的。
而且stpcpy是非标的,返回 ... 




支持下...

开个玩笑:
估计是代码混淆器....故意让别人看不懂吧


 flw 回复于:2007-08-07 17:24:42

引用:原帖由 思一克 于 2007-8-7 17:16 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7169678&ptid=971962]
例子晕了,前面的例子还没有晕呀。

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


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


 福瑞哈哥 回复于:2007-08-07 17:26:14

引用:原帖由 flw 于 2007-8-7 17:24 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7169727&ptid=971962]

我没有说返回 dest 不自然。
我尊重这种做法。
但是我认为不返回也没什么,
我的观点是返回也行,不返回也行,即不讨厌返回,也不认为一定要返回。
但是有一点我想说的是:
绝对不能为了证明 strcpy 的返 ... 



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


 flw 回复于:2007-08-07 17:28:20

引用:原帖由 福瑞哈哥 于 2007-8-7 17:26 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7169742&ptid=971962]

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


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


 思一克 回复于:2007-08-07 17:29:01

to flw,
也基本同意你说的。
但C的函数设计也是考虑的十分周到的。
无非是让一个函数有一个结果返回。因为C中函数是为主的,过程归类函数。

strcpy(buf, "12345")[0] = 'A';
strcat(strcpy(buf, "12345678"), "90abcdef");
printf("%sn", strcpy(buf, "123435"));
printf(%sn", strupr(buf, "akasklkls"));

strupr()一些地方没有,无论谁设计,不也都需要返回结果。

如果无返回,着实让使用着麻烦。


 flw 回复于:2007-08-07 17:36:01

引用:原帖由 思一克 于 2007-8-7 17:29 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7169760&ptid=971962]
to flw,
也基本同意你说的。
但C的函数设计也是考虑的十分周到的。
无非是让一个函数有一个结果返回。因为C中函数是为主的,过程归类函数。

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


我老早以前就已经说过了,我的理解是:
[color=red]反正返回了也可以不用,
而不返回就想用都用不着[/color]
因此返回其实是一种兼容了不返回的做法??对于那些喜欢不返回的人来说,你就把 strcpy 当作不返回好了,它又不妨碍你什么(也基本上不会带来性能上的损失)。
所以,我可以包容返回一个值,而且这样可以让它和别的函数看上去更统一一些,何乐而不为呢?
但是如果非要一棍子打死,
认为一定要不返回了才好,再或者不返回就不对了,
那就有点儿非理性了。


 woshiwo 回复于:2007-08-07 23:47:45

这么个问题居然盖了11楼,我只能用一个字表达:kao!


 woshiwo 回复于:2007-08-08 00:34:08

引用:原帖由 yg 于 2007-8-7 12:56 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7168069&ptid=971962]
在效率上最少也会有20-30%的提升,有的系统下会超过50%。
最关键的是,返回长度不需要额外开销。



引用:
size_t /*char * */
mystrcpy( char *des, char *src )
{
  char *p = des;

  while( *p++ = *src++ );

  return( p - des - 1 );  /* return( des ); */
}

一般来说,要找到字符串的首指针用一个指令就行了,而要找出字符串的长度,就需要很多指令,而且着些指令中还包含了大量的条件指令,会增加很多系统开销。



   
 strcpy(dst1,  strcpy(dst2,  src));   相当于d1 = d2 = s1;在c中是允许的,并且也不见得有多丑(个人审美观)。此外
 char * dst = strcpy(new char[10],  src); 申请并初始化。
上面这些做法也许确实不那么规范,但这里的哲学是严格要求自己,而不是严格要求别人。

要真是效率要求很高,又要获取长度,可以先strlen,再memcpy甚至直接moves rep。


 shangyilong 回复于:2007-08-08 10:53:26

可以通过指针取得函数结果,便于进行其他处理


 思一克 回复于:2007-08-08 10:57:48

一语中地了

引用:原帖由 shangyilong 于 2007-8-8 10:53 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=7172567&ptid=971962]
可以通过指针取得函数结果,便于进行其他处理 




 junzero 回复于:2007-08-08 16:45:41

不用strcpy,用strncpy!
不考虑其返回值!哈哈!


 Godbach 回复于:2007-08-19 19:16:24

高手过招,学习了:em03: :em03:




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=971962
转载请注明作者名及原文出处


文章评论

共有 位网友发表了评论 查看完整内容