搜集资料,交流经验……
memcmp与strncmp函数
上一篇 /
下一篇 2008-04-18 23:36:43
/ 个人分类:编程技术
u`#fv._0
int memcmp(const void * cs,const void * ct,size_t count) 51Testing软件测试网*^S4`6S%B"R8A0U
{ 51Testing软件测试网A7iJl)G3JA
51Testing软件测试网ppH1D
S&z;z/F const unsigned char *su1, *su2;
,g&G1r+[ u0 int res = 0; 51Testing软件测试网e(@MJW9]i
B
wt"t(m8R3C0 for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) 51Testing软件测试网,r&QdI#q c:tM"N
if ((res = *su1 - *su2) != 0) 51Testing软件测试网
Ud&n-m`3H*SXm
break;
5Y
r-m8s6P:x(O?9_/|~Y0 return res;
0v,]%E,Cx'Fv
U0J Gf0 }
[0K+a0g;[A0 51Testing软件测试网,p/a-k]P'O S[
int strncmp(const char * cs,const char * ct,size_t count)
\6es4R
^)h"ws0 { 51Testing软件测试网g7cq/td {/I
register signed char __res = 0; 51Testing软件测试网+d0KN,D.m
c Mw
while (count) {
0Y(wok:E;l${*TG(y0 if ((__res = *cs - *ct++) != 0 || !*cs++) 51Testing软件测试网#odp2QHK5B1^(s
break; 51Testing软件测试网e\ ]p/]ea*U/i
count--;
vu*HL]B%N0 } 51Testing软件测试网2O
eH:u1iHI
return __res;
C |?'k1J*X2N0 } 51Testing软件测试网3Uwm;r$_7p`6M E
51Testing软件测试网^(t,v#s#^1a:H0PpH-I.{1、这两个函数的差别其实还是挺大的,差别在这里: 51Testing软件测试网pf1c\Bf]a%a
对于memcmp(),如果两个字符串相同而且count大于字符串长度的话,memcmp不会在\0处停下来,会继续比较\0后面的内存单元,直到_res不为零或者达到count次数。 51Testing软件测试网H"`*d,J^#t_-U%R
对于strncmp(),由于((__res = *cs - *ct++) != 0 || !*cs++)的存在,比较必定会在最短的字符串的末尾停下来,即使count还未为零。具体的例子: 51Testing软件测试网UeV*y{[2Q
char a1[]="ABCD";
,iPY{e0 char a2[]="ABCD"; 51Testing软件测试网v'n!xo
ZJ
对于memcmp(a1,a2,10),memcmp在两个字符串的\0之后继续比较
Y;c-LM#rMeD7r0 对于strncmp(a1,a2,10),strncmp在两个字符串的末尾停下,不再继续比较。
@ ?C J%v/rt.cg0 所以,如果想使用memcmp比较字符串,要保证count不能超过最短字符串的长度,否则结果有可能是错误的。
2frwKFj|9[0
3b"JiK0M4N4Jv6R02、strncmp("abcd", "abcdef", 6) = 0。比较次数是一样的: 51Testing软件测试网+Ih`']0^}W
memcmp:在比较到第5个字符也就是'\0',*su1 - *su2的结果显然不等于0,所以满足条件跳出循环,不会再进行后面的比较。我想在其他情况下也一样。 51Testing软件测试网9_j._j},e"MZ
strncmp:同样的道理再比较到第5个字符时结束循环,其实strncmp中“!*cs++”完全等同于“!*ct++”,其作用仅在于当两个字符串相同的情形下,防止多余的比较次数。
~/j6gq8r1HN3uY0
G7qb'G:Og}0 51Testing软件测试网"k-M.ny)r }
51Testing软件测试网h'VZ8S"Pvo.i
$`W
m%E#q+{E0d(H+YA b%r"e Ll`051Testing软件测试网9Mr)g5n |'|+D*N$g3uZ6VLink URL:
http://mytesting.bokee.com/viewdiary.16149601.html
收藏
举报
TAG: