搜集资料,交流经验……

memcmp与strncmp函数

上一篇 / 下一篇  2008-04-18 23:36:43 / 个人分类:编程技术

.]vYe ZcgT0   int   memcmp(const   void   *   cs,const   void   *   ct,size_t   count)  
"u][0SgP0  {   51Testing软件测试网$dYw O0P'D1i

-V/dKlg;Y M?0  const   unsigned   char   *su1,   *su2;  
~6T+IP,y2h X0  int   res   =   0;   51Testing软件测试网:a8uZJ0P.`D@i:w*kf
    51Testing软件测试网$[ U_R3uM f
  for(   su1   =   cs,   su2   =   ct;   0   <   count;   ++su1,   ++su2,   count--)  
(Jvr)b\1^6e m0  if   ((res   =   *su1   -   *su2)   !=   0)   51Testing软件测试网#FQ:bg'WM1a
  break;  
YZV2T0@OOw0  return   res;   51Testing软件测试网2W/Hrz.s/y/]j,X9I y[
 }  
b8H0}"XmF%C0   
%u8a}'^ww _O*j0  int   strncmp(const   char   *   cs,const   char   *   ct,size_t   count)  
FJ"RBx)w8Nk;X0  {   51Testing软件测试网zaJ"D)HO_
  register   signed   char   __res   =   0;       
&q0R B4O-[j j3}\?8k]0  while   (count)   {   51Testing软件测试网U&oK\S5Q
  if   ((__res   =   *cs   -   *ct++)   !=   0   ||   !*cs++)  
1p,E*HK!m {o/K$n0  break;   51Testing软件测试网 ] UU2H.a;k
  count--;  
;vc*|l/\/x)B0  }      
L&NjZ1m/sp*L$S:y0  return   __res;   51Testing软件测试网#M}S~r,G;~${
  }

``I*^2ERjN0 51Testing软件测试网Y%~5@ WjX.e![

1、这两个函数的差别其实还是挺大的,差别在这里:     51Testing软件测试网:J-\$O"s"wf E!d
  对于memcmp(),如果两个字符串相同而且count大于字符串长度的话,memcmp不会在\0处停下来,会继续比较\0后面的内存单元,直到_res不为零或者达到count次数。      51Testing软件测试网&Oi@0g:A
  对于strncmp(),由于((__res   =   *cs   -   *ct++)   !=   0   ||   !*cs++)的存在,比较必定会在最短的字符串的末尾停下来,即使count还未为零。具体的例子:      51Testing软件测试网9I#e NO X'e;js
  char   a1[]="ABCD";   51Testing软件测试网S_E"Qm;}
  char   a2[]="ABCD";       
u qHHn:kb0  对于memcmp(a1,a2,10),memcmp在两个字符串的\0之后继续比较   51Testing软件测试网(L`!CDN
  对于strncmp(a1,a2,10),strncmp在两个字符串的末尾停下,不再继续比较。       51Testing软件测试网%?c$HN;MGYr:DL
  所以,如果想使用memcmp比较字符串,要保证count不能超过最短字符串的长度,否则结果有可能是错误的。51Testing软件测试网'h,No^3t+o

w$I,@AW02、strncmp("abcd",   "abcdef",   6)   =   0。比较次数是一样的:   51Testing软件测试网 B:?#^;w g_;d
   memcmp:在比较到第5个字符也就是'\0',*su1   -   *su2的结果显然不等于0,所以满足条件跳出循环,不会再进行后面的比较。我想在其他情况下也一样。   51Testing软件测试网 t6me*`*vi
   strncmp:同样的道理再比较到第5个字符时结束循环,其实strncmp中“!*cs++”完全等同于“!*ct++”,其作用仅在于当两个字符串相同的情形下,防止多余的比较次数。 51Testing软件测试网E!]!j,|+x P/?V

51Testing软件测试网W:G^ M5A"B!cy

 

Q)RVK&_0

1|]mQTq+L0 

3@3]_'i W;V|051Testing软件测试网 n(_D5G6M6QA
51Testing软件测试网[,A:`^zbJ g
Link URL: http://mytesting.bokee.com/viewdiary.16149601.html

TAG:

 

评分:0

我来说两句

日历

« 2024-05-22  
   1234
567891011
12131415161718
19202122232425
262728293031 

我的存档

数据统计

  • 访问量: 12324
  • 日志数: 27
  • 建立时间: 2008-04-06
  • 更新时间: 2008-04-18

RSS订阅

Open Toolbar