memcmp/strcmp和strncmp的区别

  • memcmp/strcmp和strncmp的区别
  • 举例说明
  • 附录:源码实现

memcmp/strcmp和strncmp的区别

在C语言的string.h库中,有这样3个相似的函数:memcmp,strcmp,strncmp。他们的原型分别如下:

/*************************************************************************功能:把存储区 str1 和存储区 str2 的前 n 个字节进行比较*输入:str1:要比较的字符串*     str2:要比较的字符串*       n:要比较的字节数*输出:无*返回:str<str2,<0;str1=str2,=0;str1>str2,>0
************************************************************************/
int memcmp(const void *str1, const void *str2, size_t n);
/*************************************************************************功能:把 str1 所指向的字符串和 str2 所指向的字符串进行比较*输入:str1:要进行比较的第一个字符串。*      str2:要进行比较的第二个字符串。*输出:无*返回:返回值小于 0,则表示 str1 小于 str2。*      返回值大于 0,则表示 str1 大于 str2。*       返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int strcmp(const char *str1, const char *str2);
/*************************************************************************功能:把 str1 和 str2 进行比较,最多比较前 n 个字节*输入:str1:要进行比较的第一个字符串。*     str2:要进行比较的第二个字符串。*     n:要比较的最大字符数*输出:无*返回:返回值小于 0,则表示 str1 小于 str2。*     返回值大于 0,则表示 str1 大于 str2。*       返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int strncmp(const char *str1, const char *str2, size_t n);

他们的区别如下:

  • memcmp是比较两个存储空间的前n个字节,即使字符串已经结束,仍然要比较剩余的空间,直到比较完n个字节。
  • strcmp比较的是两个字符串,任一字符串结束,则比较结束。
  • strncmp在strcmp的基础上增加比较个数,其结束条件包括任一字符串结束和比较完n个字节。

举例说明

void display(int ret)
{if(ret > 0)printf("str1 大于 str2\r\n");else if(ret < 0) printf("str1 小于 str2\r\n");else printf("str1 等于 str2\r\n");
}
int main()
{char str1[10] = {"12345"};char str2[10] = "12345";int n = 8;int ret,i;str1[5] = 0;memset(str1 + 6,'1',4);//在str1后面添加字符‘1’printf("str1:%s\r\n",str1);printf("str2:%s\r\n",str2);printf("str1空间:");for(i = 0;i<sizeof(str1);i++)printf("%d ",str1[i]);printf("\r\nstr2空间:");for(i = 0;i<sizeof(str2);i++)printf("%d ",str2[i]);printf("\r\n使用 strcmp 比较:");ret = strcmp(str1, str2);display(ret);printf("\r\n使用 memcmp 比较前%d字节:",n);ret = memcmp(str1, str2,n);display(ret);printf("\r\n使用 strncmp 比较前%d字节:",n);ret = strncmp(str1, str2,n);display(ret);printf("\r\n");system("pause");return 0;
}

运行结果如下图:

从运行结果可以看出,str1整个空间实际存储的数要大,但是str1和str2含有相同的字符串。
使用strcmp比较时,只比较到字符串结束,所以str1等于str2;使用memcmp比较时,比较n个字节空间的大小,所以str1大于str2;使用strncmp比较时,也是比较到字符串结束,所以只比较到前5个字节,所以str1等于str2。

原创不易,转载请表明出处。

附录:源码实现

/*************************************************************************功能:把存储区 str1 和存储区 str2 的前 n 个字节进行比较*输入:str1:要比较的字符串*     str2:要比较的字符串*       n:要比较的字节数*输出:无*返回:str<str2,<0;str1=str2,=0;str1>str2,>0
************************************************************************/
int Mymemcmp(const void *str1, const void *str2, size_t n)
{char *temp1,*temp2;if(str1 == NULL || str2 == NULL){printf("字符串不能为空!\r\n");exit(-1);}temp1 = (char *)str1;temp2 = (char *)str2;while(n --){if(*temp1 > *temp2)return 1;else if(*temp1 < *temp2)return -1;temp1 ++;temp2 ++;}return 0;
}
/*************************************************************************功能:把 str1 所指向的字符串和 str2 所指向的字符串进行比较*输入:str1:要进行比较的第一个字符串。*      str2:要进行比较的第二个字符串。*输出:无*返回:返回值小于 0,则表示 str1 小于 str2。*      返回值大于 0,则表示 str1 大于 str2。*       返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int Mystrcmp(const char *str1, const char *str2)
{char *temp1,*temp2;if(str1 == NULL || str2 == NULL){printf("字符串不能为空!\r\n");exit(-1);}temp1 = (char *)str1;temp2 = (char *)str2;while(*temp1 != 0 || *temp2 != 0){if(*temp1 > *temp2)return 1;else if(*temp1 < *temp2)return -1;temp1 ++;temp2 ++;}return 0;
}
/*************************************************************************功能:把 str1 和 str2 进行比较,最多比较前 n 个字节*输入:str1:要进行比较的第一个字符串。*     str2:要进行比较的第二个字符串。*     n:要比较的最大字符数*输出:无*返回:返回值小于 0,则表示 str1 小于 str2。*     返回值大于 0,则表示 str1 大于 str2。*       返回值等于 0,则表示 str1 等于 str2。
************************************************************************/
int Mystrncmp(const char *str1, const char *str2, size_t n)
{char *temp1,*temp2;if(str1 == NULL || str2 == NULL){printf("字符串不能为空!\r\n");exit(-1);}temp1 = (char *)str1;temp2 = (char *)str2;while((*temp1 != 0 && *temp2 != 0) && n--){if(*temp1 > *temp2)return 1;else if(*temp1 < *temp2)return -1;temp1 ++;temp2 ++;}if(n)//由于字符串结束而提前结束{if(*temp1 == 0 && *temp2 != 0)//str1比str2短return -1;else if(*temp1 != 0 && *temp2 == 0)//str1比str2长return 1;elsereturn 0;}return 0;
}

C语言库函数:memcmp/strcmp和strncmp的区别相关推荐

  1. 【面试题】C语言:模拟实现memcmp,试比较memcmp与strcmp,strncmp的区别

    模拟实现内存比较函数memcmp: 该函数与strcmp有相似之处,都可用于字符串比较是否相同,若相同,则返回0值.若前者大于后者,则返回大于0的整型值,否则返回小于0的整型值.  区别在于: str ...

  2. strcmp与strncmp的区别

    strcmp与strncmp都是用来比较字符串的,区别在于strncmp是比较指定长度字符串,两者都是二进制安全的,且区分大小写. strcmp strcmp(string1,string2) 设这两 ...

  3. C语言——数组、字符串处理函数、strlen、strcpy和strncpy、strcat和strncat、strcmp和strncmp

    目录 一.数组 1.定义:类型 数组名[元素个数] 2.数组不能动态定义 3.如何访问数组中的元素:数组名[下标] 4.循环与数组的关系 5.数组的初始化 二.C99标准中的数组 三.字符串处理函数 ...

  4. C语言 : strcmp与strncmp详解

    strcmp与strncmp都是用来比较字符串的,区别在于能否比较指定长度字符串. strcmp 设这两个字符串为str1,str2, 若str1==str2,则返回零: 若str1 > str ...

  5. 语言库函数大全--资料收集整理

    语言库函数大全–资料收集 Turbo C 2.0 函数中文说明大全 分类函数,所在函数库为ctype.h int isalpha(int ch) 若ch是字母('A'-'Z','a'-'z')返回非0 ...

  6. C语言库函数— qsort () 详解

    目录 1. qsort()函数简介 1.1 函数原型 1.2 函数参数 2. 比较函数简介 2. 1 比较函数参数 2.2 比较函数使用 3. qsort()函数使用 3.1 整形数组排序 3.2 字 ...

  7. 编写strcmp 和strncmp

    函数原型及介绍 若str1==str2,则返回零: 若str1 > str2,则返回正数: 若str1< str2,则返回负数. 即:两个字符串自左向右逐个字符相比(按ASCII值大小相比 ...

  8. C语言库函数的模拟实现

    目录 C语言库函数的模拟实现 1.求字符串长度  ---  strlen的模拟实现 2.拷贝字符串  ---  strcpy的模拟实现 3.追加字符串  ---  strcat的模拟实现 4.比较字符 ...

  9. c语言函数库哪里keyk,[精品]C语言库函数(字母G-K)-教案.doc

    [精品]C语言库函数(字母G-K)-教案 C语言库函数(字母G-K)- - ?????????????????????????????????????? (G类字母) - 1 函数名: gcvt 功 ...

  10. C语言中positive用法,sprintf - C语言库函数

    C库类 的 sprintf - C语言库函数 C库函数int sprintf(char *str, const char *format, ...)发送str 指向一个字符串的格式化输出. 声明 以下 ...

最新文章

  1. C++11 :STL中的 iota ()函数
  2. python使用正则表达式检测给定的URL地址是否合法
  3. Xilinx FPGA开发工具总结
  4. keil5一点project就闪退
  5. 如何创建圆角 UITextField 与内阴影
  6. some understanding of《Inferring Decision Trees Using the Minimum Description Length Principle*》
  7. SAP Data Intelligence Graph使用浏览器访问的url规范
  8. 手机技巧:手机关掉这个开关,一下能省2G内存,再也不怕卡顿死机
  9. STM32F407+CubeMX-使用TIM产生PWM信号
  10. kissy 淘宝网脚本库
  11. C#中的深度学习:ML.NET中具有预训练模型的硬币识别
  12. centos设置时间时区
  13. 力扣-169 多数元素
  14. 5.SOA架构:服务和微服务分析及设计--- REST服务建模过程
  15. python获取快手无水印demo
  16. 按键双击和单击c语言,【按键】[独立按键] - 单击,双击,三击以及N击
  17. linux中yaml安装包如何安装,yaml-cpp的安装
  18. 吴声年度演讲全文:场景品牌,新商业的此时此刻
  19. 592. 分数加减运算 : 表达式计算入门题
  20. 协议分析(微信网页版 wx2.qq.com)

热门文章

  1. Leetcode刷题学习记录
  2. 【近五千字纯手撸】✨前后一个月面试30家中大型高级、资深java工程师终获500强公司offer心得以及经过
  3. jQuery实现打字小游戏
  4. mac电脑如何查看cpu占用率?以及如何修复Mac的“ kernel_task” CPU使用率过高的Bug
  5. 抽象代数 04.03 Sylow 子群
  6. python实现1分钟内股价波动邮件提示
  7. Windows安装证书
  8. 深度学习、目标检测相关博客链接
  9. openssl自签名CA证书
  10. linux的dlan脚本,Linux DLNA