memcmp与strcmp区别

作者:无名 - 开源软件 -

一、memcmp含义


Compare characters in two buffers.


int memcmp(    const void* buf1,    const void* buf2,    size_t count );inline int wmemcmp (   const  wchar_t* buf1, const wchar_t* buf2, size_t count);


Parameters



       buf1    :  First buffer.

       buf2    :  Second buffer.

       count   : Number of characters.

       Return Values   : The return value indicates the relationship between the buffers.

       Return Value Relationship of First count Bytes of buf1 and buf2

        < 0        buf1 less than buf2

        0        buf1 identical to buf2

> 0



buf1 greater than buf2


 二、memcmp与strcmp的区别


int   memcmp(const   void   *   cs,const   void   *   ct,size_t   count)   

  {  


  const   unsigned   char   *su1,   *su2;   

  int   res   =   0;   

    

  for(   su1   =   cs,   su2   =   ct;   0   <   count;   ++su1,   ++su2,   count--)   

  if   ((res   =   *su1   -   *su2)   !=   0)   

  break;   

  return   res;   

 }   

    

  int   strncmp(const   char   *   cs,const   char   *   ct,size_t   count)   

  {   

  register   signed   char   __res   =   0;       

  while   (count)   {   

  if   ((__res   =   *cs   -   *ct++)   !=   0   ||   !*cs++)   

  break;   

  count--;   

  }      

  return   __res;   

  }


1、这两个函数的差别其实还是挺大的,差别在这里:     

  对于memcmp(),如果两个字符串相同而且count大于字符串长度的话,memcmp不会在\0处停下来,会继续比较\0后面的内存单元,直到_res不为零或者达到count次数。      

  对于strncmp(),由于((__res   =   *cs   -   *ct++)   !=   0   ||   !*cs++)的存在,比较必定会在最短的字符串的末尾停下来,即使count还未为零。具体的例子:      

  char   a1[]="ABCD";   

  char   a2[]="ABCD";       

  对于memcmp(a1,a2,10),memcmp在两个字符串的\0之后继续比较   

  对于strncmp(a1,a2,10),strncmp在两个字符串的末尾停下,不再继续比较。       

  所以,如果想使用memcmp比较字符串,要保证count不能超过最短字符串的长度,否则结果有可能是错误的。


2、strncmp("abcd",   "abcdef",   6)   =   0。比较次数是一样的:   

   memcmp:在比较到第5个字符也就是'\0',*su1   -   *su2的结果显然不等于0,所以满足条件跳出循环,不会再进行后面的比较。我想在其他情况下也一样。   

   strncmp:同样的道理再比较到第5个字符时结束循环,其实strncmp中“!*cs++”完全等同于“!*ct++”,其作用仅在于当两个字符串相同的情形下,防止多余的比较次数。


以上就是由(IT人知识库http://www.itpeo.net/15310/3488250.html)本站为大家整理





标签 区别区分

POI与JXL写Excel的性能对比

         在java项目中... ...

编写框架代码的注意事项

错误处理: 对于运行时可能出现的环境运行错误,在框架内部不要用try完全处理掉,而是要显示向外部... ...

怎样在线程外部控制线程运行

一个在外部控制线程运行的一个论证实例。标准的java因为安全问题取消了stop等控制方法,我想看看能不能自己把它们... ...

推荐给每个找工作的IT毕业生--打鸡血书

本文忘了在哪里下载的了,转过来与各位共享 一、 求职历程总结 2007年1月10日,随着在三方协... ...

linux(ubuntu)下安装nginx 笔记

这两天突然想在ubuntu下 安装nginx模拟真实环境,第一次安装还真是一个充满奇异的旅程,走了很多歪路但也从中... ...

Unix crontab命令 添加定时任务

Unix crontab命令 添加定时任务 使用crontab命令要求root身份1. cr... ...

rfedfre

随手写了个android应用

最近比较闲,就边学边写,做了个android下的 dota 攻略型应用。 目前还没发布到市场上,也没有加广告,... ...

rfedfre

高仿QQ空间-进阶篇

更新说明: 一 增加了照片的墙的功能,可以让你的照片可以流动哦!不信,你去试试就知道啦,O(∩_∩)O哈哈哈~... ...

rfedfre

1.变量和常量

1 标识符 标识符就是用于给 Java 程序中变量、类、方法等命名的符号。 1>.  ... ...

The working copy "xxx" has uncommitted changes.

    进到它说提示的目录中,使用git reset --hard命... ...

map的用法(初级)

C++中map容器提供一个键值对容器,map与multimap差别仅仅在于multiple允许一个键对应多个值。本... ...

慎用异常(Exception)

异常对性能不利。 1.抛出异常首先要创建一个新的对象。 2.Throwable接口的构造函数调用名为fil... ...

改进fastjson的WriteClassName特性时的输出数据容量

在使用fastjson输出省市县三级信息时,数量高达300K,由于我们的数据结构相同,因此每个类都输出了完整的类名... ...

mongodb建立索引时怎么指定超时时间

mongodb自从2.2版本起为索引建立了TTL(time to live),可以指定一个类型为日期的字段为文档的... ...

JS日期格式化(从YYYY-MM-DD到日期类)

字符串格式日期利用阅读,但不利于标准化存储,可以通过以下函数转化为Javascript日期类: // date... ...

(翻译)H5数据流消息推送机制Event Source

关于数据推送,传统方法是前端(不)定时发送HTTP请求进行轮询。但这种方式非常的损耗服务器资源,不适合访问量高的情... ...

linux命令后台运行技巧整理(1)

所有内容搜集于网络,部分做了简单翻译 Linux提供了fg和bg命令,让你轻松调度正在运行的任务。 假设你... ...

rfedfre

基于标签方式的工作流启动及任务执行开发说明

基于现在的系统的整合需求,本系统提供基于标签的工作流整合方式,工作流的启动及执行下一步时,均需要通过可以通... ...

rfedfre

厦门 测试夹具

厦门 测试夹具    我司专\业制\作测试工装夹具治具、过锡炉回流焊治具、老化架、热... ...

Guile资源站点

官方站点:http://www.gnu.org/software/guile/ http://com... ...