请教一下在字符串处理中memcpy与strncpy的区别

Advanceer
请教一下在字符串处理中memcpy与strncpy的区别

请问一下对于字符串的处理,二者有区别吗? 哪个的效率更高一些? 会差很多吗?

aoegiss
memcpy不管结尾
strncpy反之

yecheng_110
flw会说
注意语义:mrgreen:

cugb_cat
mem是memory的意思
str是string的意思。

scutan
在本版搜一下吧, 很多相关资料的。

err7dd
memcpy为内存拷贝
strcpy为字符串拷贝

net_robber
str n cpy

mem cpy

zszyj
[quote]原帖由 [i]Advanceer[/i] 于 2008-6-23 22:53 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8646161&ptid=1168251][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
请问一下对于字符串的处理,二者有区别吗? 哪个的效率更高一些? 会差很多吗? [/quote]
memcpy是C语言的原生系统调用,是直接对应成CPU的批量内存传送指令, 当然是快了. 但它不能处理字符串, 只能由你告诉内存传送的字节数.
strcpy基本上是循环实现的,可以自已查找结束符. 两者的用法是不一致的.

Advanceer
回复 #1 Advanceer 的帖子

晕,我的问题明明是

1. 在对字符串处理中,二者有什么区别? 因为对字符串,二者参数都相同
2. 我问的是 strncpy 不是 strcpy . strncpy也不做截尾操作的。

楼上的说法是 strcpy是循环实现的,可是strncpy呢? 二者速度相差很多吗? 我现在有一个运用,都是用strncpy写的,我考虑批量 替换成 memcpy因为参数都相同,我只要替换程序名就可以了,不知道能否显著提高速度??

谢谢! 最好能跟我讲讲两个函数操作的原理!

flw
[quote]原帖由 [i]Advanceer[/i] 于 2008-6-24 07:44 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8647282&ptid=1168251][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]

楼上的说法是 strcpy是循环实现的,可是strncpy呢? 二者速度相差很多吗? 我现在有一个运用,都是用strncpy写的,
[color=blue]我考虑批量 替换成 memcpy[/color][color=red]因为参数都相同[/color],我只要替换程序名就可以了,不知道能否显著提高速度??[/quote]
注意语义……
并不是参数相同就可以互相代替的……

xi2008wang
[quote]原帖由 [i]yecheng_110[/i] 于 2008-6-23 23:38 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8646312&ptid=1168251][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
flw会说
注意语义:mrgreen: [/quote]
:mrgreen:

zszyj
[quote]原帖由 [i]Advanceer[/i] 于 2008-6-24 07:44 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8647282&ptid=1168251][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
晕,我的问题明明是

1. 在对字符串处理中,二者有什么区别? 因为对字符串,二者参数都相同
2. 我问的是 strncpy 不是 strcpy . strncpy也不做截尾操作的。

楼上的说法是 strcpy是循环实现的,可是strnc ... [/quote]
memcpy的语义是, 不管内容里是否有'/0', 它都忠实地进行N字节的拷贝.
strncpy的语义是, 进行N字节的拷贝, 如果中途遇到'/0'则提前结束.
是否相同,那就看你对'/0'后的内容是否关心了. strncpy替换memcpy不合适, 但相信memcpy替代strncpy是不会有问题的.
从速度上来讲, 前面已经提到了, 一个是系统调用, 一个是库函数, 速度差距肯定是明显的, 但两者的作用有区别.
只不过, C语言的实现已经是非常快的, 我以前在一个贴子里也提到过, 可能是10的-8次和10的-9次的差别, 那么这种相别重要吗?

emacsnw
strncpy是个设计的充分糟糕的函数:当src长度大于等于n的时候结果不一定再是'/0'结尾的字符串,而当src长度小于n时会补0补满n,效率很低。

net_robber
[quote]原帖由 [i]emacsnw[/i] 于 2008-6-24 10:13 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8648464&ptid=1168251][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
strncpy是个设计的充分糟糕的函数:当src长度大于等于n的时候结果不一定再是'/0'结尾的字符串,而当src长度小于n时会补0补满n,效率很低。 [/quote]


非常不同意你的说法

1、效率低你是从哪里得到证明的?
2、这个函数时必须要存在的,它可以有效防止字符串指针越界等情况的发生

emacsnw
[quote]原帖由 [i]net_robber[/i] 于 2008-6-23 18:35 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8648726&ptid=1168251][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]



非常不同意你的说法

1、效率低你是从哪里得到证明的?
2、这个函数时必须要存在的,它可以有效防止字符串指针越界等情况的发生 [/quote]

关于strncpy效率低下,至少我们公司对此有明文规定。关于其不方便处,不知道你是否经常写完了strncpy后加一句dst[n-1] = '/0'; ?

yecheng_110
[quote]原帖由 [i]net_robber[/i] 于 2008-6-24 10:35 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8648726&ptid=1168251][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]



非常不同意你的说法

1、效率低你是从哪里得到证明的?
2、这个函数时必须要存在的,它可以有效防止字符串指针越界等情况的发生 [/quote]
又比较'/0'又比较字符串长度 效率肯定会低些
这个函数不是必须的吧 只是可以预防一些问题而已

emacsnw
[quote]原帖由 [i]yecheng_110[/i] 于 2008-6-23 18:39 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8648790&ptid=1168251][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]

又比较'/0'又比较字符串长度 效率肯定会低些
这个函数不是必须的吧 只是可以预防一些问题而已 [/quote]

嗯,安全的字符拷贝有其他替代函数。甚至snprintf都比这个好。

converse
我用snprintf,而不是strncpy.

flw
[quote]原帖由 [i]converse[/i] 于 2008-6-24 10:52 发表 [url=http://bbs.chinaunix.net/redirect.php?goto=findpost&pid=8648946&ptid=1168251][img]http://bbs.chinaunix.net/images/common/back.gif[/img][/url]
我用snprintf,而不是strncpy. [/quote]
strncpy 行为的复杂性给编程带来了很多麻烦,
还是 snprintf 省事,统一。
不过用 snprintf copy taint 字符串时,一定要记得用 "%s"。

[[i] 本帖最后由 flw 于 2008-6-24 10:55 编辑 [/i]]

flw2
那不知大家用snprintf是否需要检查返回值 :mrgreen:
如果strncpy不如snprintf, 那那strcpy不如用sprintf
strncpy的用法通常是
char buf[MAX_SIZ];
strncpy(buf, str, sizeof(buf)-1);
不需要buf[MAX_SIZ-1] = 0;

仅仅考虑copy 10多字节的字符串, snprintf的效率通常是strncpy的数百分之一(看看snprintf的代码就知道了,不过我没调查过,谁有兴趣可以试试)
上一篇:又有问题~~ 下一篇:为什么?