-------1)strcmp‘和strncmp都是到\0’结束,memcmp是到size个字节后结束。

-------2)strcmp和strncmp只能比较字符串,memcmp可以比较包含字符串等多种数据类型。

函数:int memcmp (const void *a1, const void *a2, size_t size) 
       函数memcmp用于比较字符串s1与s2的前size个字符。 
      如果两上字符块相同,memcmp将返回0。

函数:int strcmp (const char *s1, const char *s2) 
       这个函数用来比较s1和s2字符串,这个函数将返回一个值,它的符号与第一对不同的字符的比较结果相关。 
      如果两个字符串相等的话,strcmp将返回0。 
       如果s1是s2的一个子串的话,s1小于s2 
此外还有函数 
    int strncmp (const char *s1, const char *s2, size_t size) 
    此函数与strcmp极为类似。不同之处是,strncmp函数是指定比较size个字符。也就是说,如果字符串s1与s2的前size个字符相同,函数返回值为0。

功能比较:

二者都可以用于字符串的比较,但是二者是有比较大的差异的,因为strcmp是按照字节(byte-wise)比较的,并且比较的过程中会检查是否出现了"\0"结束符,一旦任意一个字符串指针前进过程中遇到结束符,将终止比较。而memcmp函数是用于比较两个内存块的内容是否相等,在用于字符串比较时通常用于测试字符串是否相等,不常进行byte-wise的字符串比较。如果要比较的对象中包含一些由于边界对齐需求而填入结构对象中的空格、联合 (union)结束的额外空格、字符串所分配的空间未使用完的部分引起的“holes”的话,最好使用memcmp来完成。这些“holes”的内容是不确定的,在执行byte-wise比较时结果也是不明确的。

效率差异: 
     strcmp比较的字符串,而memcmp比较的是内存块,strcmp需要时刻检查是否遇到了字符串结束的 \0 字符,而memcmp则完全不用担心这个问题,所以memcmp的效率要高于strcmp

使用示例:

给出一个如下的结构定义:

struct foo
{ unsigned char tag; union { double f; long i; char *p; } value;
}; 

如果要比较两个struct foo对象的话,建议最好使用memcmp。 
     在给出一个字符串比较的例子,判断字符串str中前四个中字符是否为 0x80100001,因为0x00对于字符串而言,这是个结束符,如果使用strncmp的话strncmp(str,"\x80\x10\x00 \x01",4)的话,实际效果是只判断了是否含有0x8010,也就是说一旦str中前两个字符为0x8010就返回0,表示相同了,显然这是不正确的!此时应该使用memcmp(str,"\x80\x10\x00\x01",4),这样一来就达到了目的

附:strcmp,strncmp,memcmp的Linux的源代码

/** 
* strcmp - Compare two strings 
* @cs: One string 
* @ct: Another string 
*/ 
int strcmp(const char *cs, const char *ct) 

        signed char __res;

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

//比较到结束符/0,时,已经做了__res = *cs - *ct了,但是此时*cs和*ct的值都为/0,所以返回肯定为0 
                        break; 
        } 
        return __res; 

/** 
* strncmp - Compare two length-limited strings 
* @cs: One string 
* @ct: Another string 
* @count: The maximum number of bytes to compare 
*/ 
int strncmp(const char *cs, const char *ct, size_t count) 

        signed char __res = 0;

while (count) { 
                if ((__res = *cs - *ct++) != 0 || !*cs++)                  //比较到结束符\0,时,已经做了__res = *cs - *ct了,所以不等长度时,肯定返回不为0 
                        break; 
                count--; 
        } 
        return __res; 

/** 
* memcmp - Compare two areas of memory 
* @cs: One area of memory 
* @ct: Another area of memory 
* @count: The size of the area. 
*/ 
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; 
}

测试程序:

#include 
#include 
#include

using namespace std;

int main() 

string str1 = "abcd"; 
string str2 = "abcdef";

int result1 = 0; 
int result2 = 0; 
int result3 = 0;

result1 = strcmp(str1.c_str(),str2.c_str()); 
result2 = strncmp(str1.c_str(),str2.c_str(),7); 
result3 = memcmp(str1.c_str(),str2.c_str(),7);

cout<<"strcmp: "< < 
cout<<"strncmp: "< < 
cout<<"memcmp: "< <

getchar(); 
return 0; 
}

得出结论:

示例字符串 str1 = "abcd";

srr2 = "abcdef";

(1)strmcp比较结果为非0(不等)。

(2)strncmp,若count <= 4,结果为0(相等);若count > 4,则结果-101(因为最短的字符串长度为4,所以比较到第5个字符即结束,值为'/0'的ascii码减去‘e’的ascii值)。

(3)memcpy,若count <= 4,则结果为0(相等);若count > 4,则结果为-1(比较到第count个字节即结束)。
————————————————
版权声明:本文为CSDN博主「atopp」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ttgoo/article/details/5828978

strcmp, strncmp和memcmp的区别相关推荐

  1. (C语言)常用的字符串函数介绍(strcpy,strncpy,strcat,strncat,strcmp,strncmp,strchar,strlen)非常详细

    理解 strcpy,strncpy,strcat,strncat,strcmp,strncmp,strchar,strlen这些函数,可以帮助我们更好的对字符串进行操作,做到玩转字符串. 目录 1.s ...

  2. strcmp/strncmp导致的段错误浅析

    引出问题 项目中有如下代码片段: #include <stdio.h> #include <string.h>struct st {char *buf;int buflen; ...

  3. stricmp linux 头文件,strcmp/strncmp/stricmp(windows) strcasecmp/strncasecmp(linux)

    str***cmp函数的是不是有很多人见过啊....... 而且有有时候非常的头疼,这样的函数有的会记不住,今天我就在让大家记不住一下,(哈哈哈!!!!) strcmp 这个函数是用来比较两个字符串之 ...

  4. strcmp/strncmp

    strcmp的原型翻译string compare,作用:字符串比较,而且仅限于字符串大小的比较: 原型:int strcmp(const char *s1, const char *s2); 返回值 ...

  5. 机器学习之线性回归_通过线性回归开始机器学习之旅

    机器学习之线性回归 线性回归 (Linear Regression) Linear regression is a part of Statistics that defines the relati ...

  6. memcpy和strcpy的区别及memcmp和strcmp的区别

    strcpy与memcpy的区别: strcpy的原型:char *strcpy(char *dest, const char *src) strcpy是拷贝字符串.①不指定长度②以\0为标志结束(即 ...

  7. 第九篇,const指针,strlen,strcpy和strcmp函数的详细讲

    一.今天安排. 1.const指针. 2.strlen字符串函数. 3.讲题目. 4.2点到4点.  --> 自己做题目 5.4点继续讲字符串函数. 二.const指针. 1.什么是const指 ...

  8. linux 函数返回string,linux 下c函数strcmp的返回值疑问?

    linux 下c函数strcmp的返回值疑问? strcmp函数解释: NAME strcmp, strncmp - compare two strings SYNOPSIS #include int ...

  9. sco unix和linux区别,SCOUNIX到Linux操作系统的程序移植问题有哪些呢?

    一.SCO 的cc 与LINUX 的gcc的一些差别 总的来说,linux的gcc编译器相对sco下的cc要严格许多.通过这次移植发现SCO的cc对程序的要求实在不怎么严谨.举个例子,比如strcpy ...

最新文章

  1. 图灵赠书——程序员12月书讯
  2. python 用户的画像可视化呈现技术_一人一车一面:解读汽车大数据用户画像背后的AI技术...
  3. Spring的起源和背景
  4. 初学Phreeze 3
  5. ros先订阅后发布 无法收到消息的解决办法
  6. [Python] 字符串大写变小写 lower()函数
  7. stl_algorithm算法之排序算法
  8. SQlite数据库的C编程接口(二) 数据库连接 ——《Using SQlite》读书笔记
  9. 平衡的阵容——洛谷——2880——RMQ
  10. 新装Kubuntu 18.04后的一些操作
  11. lch 儿童围棋课堂 初级篇1 ( (李昌镐 著))
  12. 亚控科技工作中的编程知识小积累
  13. 有赞.测试团队介绍(转)
  14. 【翻译】代码指针完整性——Code Pointer Integrity
  15. 中兴微型计算机,售价2698元起!中兴首款5G视频手机AR线上发布
  16. 机器视觉工程师前景如何,计算机视觉工程师薪资
  17. 源代码与二进制文件SCA检测原理
  18. 远古vod5.0的安装!
  19. t3实训控制系统服务器,T3教育专版,实训控制系统,考试服务器安装,IIS已经装过了,但是还是提示这个错误。电脑是SERVER2003,ISO原版!...
  20. mysql对网站seo的作用_友情链接对于网站SEO的作用有哪些

热门文章

  1. Notes Twelfth Day-渗透攻击-红队-命令与控制
  2. python开源编译器,python开发编译器
  3. properties文件
  4. Echarts中DataView显示Excel表格
  5. 2015年可视化研究前沿动态
  6. 使用FFmpeg工具将一个图片和一个音频合成一个视频以及在window系统下使用脚本运行
  7. 如何跳出令人窒息的职场死循环
  8. 身价过亿的妖媚子对小码农说串口能传送我的爱吗?
  9. 作为程序员面试官的3点建议
  10. 大一学生一周十万字爆肝版C语言总结笔记