自定义memcmp函数实现遇阻:通用数组字节比较代码求助
修正你的
byte_compare函数(模拟memcmp) 咱们先逐个揪出代码里的问题,再给出符合要求的修正版本:
原代码的核心错误
- 变量名不匹配:函数定义的参数是
b1和b2,但函数内部却用了p1和p2,这会直接导致编译失败。 - 循环逻辑错误:
len已经是你指定要比较的字节数,而q1是char*指针,sizeof(*q1)固定为1,所以len*sizeof(*q1)完全是多余的操作,等于直接写len。- 循环条件用
i<=len会让循环多执行一次(从0到len共len+1次),超出了你要求的字节长度,正确的应该是i<len。
- 返回值不符合
memcmp的标准行为:原代码只能返回0(相等)或1(不相等),但标准memcmp会返回负数、0、正数,分别表示第一个数组的字节小于、等于、大于第二个数组的对应字节,这样才能完整模拟其功能。 - const正确性问题:你把
const void*转换成了char*,丢失了const属性,应该转换成const char*,避免意外修改输入的只读数据。
修正后的完整代码
#include <stddef.h> // 用于size_t类型的定义 int byte_compare(const void *b1, const void *b2, size_t len) { // 转换成const char*,保证const正确性 const char *q1 = (const char *)b1; const char *q2 = (const char *)b2; for (size_t i = 0; i < len; i++) { if (*q1 != *q2) { // 返回差值,符合memcmp的返回规则:正数/负数表示大小关系 return *q1 - *q2; } q1++; q2++; } // 所有字节都相等,返回0 return 0; } // 测试示例 #include <stdio.h> int main() { char arr1[] = "hello"; char arr2[] = "world"; int int_arr1[] = {1, 2, 3}; int int_arr2[] = {1, 4, 3}; // 比较char数组的前3个字节 int cmp1 = byte_compare(arr1, arr2, 3); printf("char数组前3字节比较结果:%d\n", cmp1); // 输出负数('h' < 'w') // 比较int数组的前4字节(第一个int的大小) int cmp2 = byte_compare(int_arr1, int_arr2, sizeof(int)); printf("int数组第一个元素比较结果:%d\n", cmp2); // 输出0(两个int的字节内容相同) // 比较int数组的前8字节(前两个int) int cmp3 = byte_compare(int_arr1, int_arr2, 2*sizeof(int)); printf("int数组前两个元素比较结果:%d\n", cmp3); // 返回2和4的字节差值 return 0; }
额外说明
- 用
size_t作为循环变量的类型,因为len是size_t(无符号整数),避免符号不匹配的问题。 - 返回
*q1 - *q2完全符合memcmp的行为:如果第一个不同的字节q1小于q2,返回负数;反之返回正数;全部相等返回0。 - 支持任意类型的数组,因为我们把指针转换成
char*来逐字节比较,这正是memcmp的核心逻辑。
内容的提问来源于stack exchange,提问作者Milo
相关产品推荐
相关产品推荐

