一、基本概念
memcmp
和strcmp
都是C语言标准库中的字符串比较函数。
strcmp()
主要功能是比较两个字符串的大小,也就是按字节比较两个字符串中相应字符的ASCII码值的大小。
memcmp()
主要功能是比较两段内存区域的大小,也就是按字节比较两个内存区域中相应字节的值的大小。
二、参数列表
strcmp()
有两个参数,都是指向字符串的指针。假设这两个指针分别为str1
和str2
,那么strcmp(str1, str2)
的返回值可能是下列三种中的一种:
str1 == str2
,返回值为0str1 < str2
,返回值小于0str1 > str2
,返回值大于0
memcmp()
也有两个参数,分别是指向两段内存的指针和比较的字节数。假设这两个指针分别为ptr1
和ptr2
,比较的字节数为size
,那么memcmp(ptr1, ptr2, size)
的返回值可能是下列三种中的一种:ptr1 == ptr2
,返回值为0ptr1 < ptr2
,返回值小于0ptr1 > ptr2
,返回值大于0
三、比较方式
strcmp()
是在两个字符串中逐个字符比较,直到出现字符不相同为止。如果全部字符相同,那么两个字符串就是相等的,函数返回值为0。如果出现字符不相等,那么两个字符串的比较结果就是出现不相等的字符的ASCII码值的差,函数返回值为这个差值。
如果字符串中存在空字符\0
,那么strcmp
函数在遇到空字符时就认为这个字符表示字符串的结束,因此就不会比较空字符后面的字符了。这也意味着在遇到空字符前,如果两个字符串都相等,那么这两个字符串就是相等的。
memcmp()
是逐个比较内存块中的字节值。如果遇到不同的字节,那么比较就立即结束,函数返回值就是不同字节的值的差。如果两个内存块完全相同,那么memcmp
的返回值就是0。
四、适用场景
strcmp()
比较适合用于比较字符串,特别是C-style的字符串。对于C++的string
类型,除非两个string
长度相同,否则strcmp()
并不总是能正确比较它们。实际上,它们并不是一定被存储在连续的内存区域里的。
memcmp()
则更加通用,适用于任何类型的数据的比较。如果需要比较二进制数据,那么memcmp()
比strcmp()
更能胜任。此外,如果需要比较的数据并非字符串,或者需要比较的字符串当中包含了空字符\0
,那么memcmp()
才能够有效地进行比较。
五、示例代码
#include <stdio.h>
#include <string.h>
int main()
{
char str1[20] = "abcdef";
char str2[20] = "abcdeR";
int cmp = strcmp(str1, str2);
int mem = memcmp(str1, str2, strlen(str1));
int mem_s = memcmp(str1, str2, strlen(str2));
printf("strcmp: %d\n", cmp);
printf("memcmp (strlen(str1)): %d\n", mem);
printf("memcmp (strlen(str2)): %d\n", mem_s);
return 0;
}