作用
strcmp函数是用来比较两个字符串是否相等的,它会逐个字符比较两个字符串,直到找到第一个不同的字符或者两个字符串都结束。而memcmp函数是用来比较两个内存区域是否相等的,它会逐个字节地比较两个内存区域,直到找到第一个不同的字节或者两个内存区域都结束。
strcmp函数比较的是字符串,而memcmp函数比较的是二进制数据。strcmp函数只能比较字符串类型的数据,而memcmp函数可以比较任意类型的数据。
比较
memcmp函数通常比strcmp函数更快,strcmp函数还需要处理字符串结束符\0,而memcmp函数没有这个限制。strcmp函数需要逐个字符比较,而memcmp函数可以比较整个内存区域。但是需要注意strcmp函数会自动终止比较,当遇到\0字符时会停止比较,而memcmp函数不会,它会比较指定的字节数。所以在将strcmp替换成memcmp时,需要先获取数据大小,然后再使用memcmp函数进行比较。
使用
如果想将strcmp替换成memcmp,需要知道传入数据的size是多大。
a 对于字符串数据,可以使用strlen函数获取字符串的长度,然后使用memcmp函数进行比较。strlen函数仅适用于以\0字符结尾的字符串,如果字符串中包含\0字符,需要使用其他方法获取字符串长度。
b 对于数组数据,可以使用sizeof函数获取数组的长度,然后使用memcmp函数进行比较。另外,sizeof运算符仅适用于已知大小的数组。如果是动态分配的数组,在malloc分配内存的时候通常就已经将数组大小传入函数了,所以这个大小就是数组长度。如果是动态分配的指针,则因为其只知道指向而不知道指向内容的大小,所以需要将指针指向的内存看作一个数组,然后使用sizeof运算符来获取数组的大小。例如:
int* ptr = (int*)malloc(sizeof(int) * n);
int size = sizeof(*ptr) * n;
// ptr是一个指向整型数组的指针,*ptr表示指针指向的整型元素,因此可以使用sizeof(*ptr)来获取每个元素
// 的大小,然后再乘以n来获取整个数组的大小。
c 对于结构体数据,可以使用sizeof运算符获取结构体的大小,然后使用memcmp函数进行比较。
结论
从实际使用角度,在字符串的比较上来说,如果在不知道传入的字符串大小的情况下,先使用strlen获取字符串大小,再使用memcmp函数进行比较这种方式在效率上是比直接使用strcmp函数效率略低的,因为需要先遍历一遍字符串来获取其长度。
但是在比较前知道字符串长度的情况中。 在两个字符串相等的时,使用memcmp时间复杂度是O(n),其中n是字符串长度。使用strcmp函数的时间复杂度是O(1)。当两个字符串不相等时,使用memcmp函数的时间复杂度是O(n),而使用strcmp函数的时间复杂度是O(min(m,n)),其中m和n分别是两个字符串的长度。
因此,在字符串长度已知的情况下,使用memcmp函数通常比使用strcmp函数效率更高。但是,在字符串长度未知的情况下,只能使用strlen和memcmp组合来比较字符串,这时效率会略低。
备注:O(n)表示算法执行时间与输入规模n成正比,即当n增加一倍时,算法执行时间也增加一倍。O(1)表示算法执行时间与输入规模n无关,即算法执行时间不随着输入规模n的增加而增加。因此,随着输入规模n的增大,O(n)算法的执行时间会增加,而O(1)算法的执行时间不会增加。所以在比较大规模输入的时候,使用O(1)算法的效率通常更高。