我试图创建自己的memcmp
文件,但每当我将其与原始memcmp
函数进行比较时,相等字符串返回零,但在不相等字符串的情况下返回值不同。
char *p = (char *)s1;
char *q = (char *)s2;
int charCompareStatus = 0;
if (s1 == s2) {
return charCompareStatus;
}
while (n > 0) {
if (*p != *q) {
charCompareStatus = (*p > *q) ? (*p - *q) : (*p - *q);
break;
}
n--;
p++;
q++;
}
return charCompareStatus;
与真实的memcmp
函数相比,输出为
./a.out“ajinkya”“akinkya”
MEMCMP:-256
SST_MEMCMP:-1
4条答案
按热度按时间cig3rfwq1#
没有指定
strcmp
和memcmp
的确切返回值。如果第一个参数在逻辑上较小,则可以返回 any 负值,如果第一个参数较大,则可以返回 any 正数。所以,-1
,-10
,-42
的返回值都意味着相同的事情。kpbwa7wx2#
memcmp()
返回的确切值没有指定,只有符号和它是否为0才重要。但是请注意,您的实现是不正确的,因为内存的内容应该作为
unsigned char
值进行比较,而不是char
值,后者可能是负数。此外,表达式
(*p > *q) ? (*p - *q) : (*p - *q)
是多余的,你可以写*p - *q
。以下是修改后的版本:
aelbi1ox3#
如果
first
>second
,则Memcmp返回正数;如果first
<second
,则返回负数;如果两个字节序列相等,则返回0
。这是按字典顺序完成的,也就是说,函数在第一次遇到差异时决定。比较两个字符串的最简单方法是:
如果你想保持与标准libray版本相同的原型,你需要使用
void *
指针,并在内部将它们转换为unsigned char *
,如下所示:(you不需要使用
const void *
,因为void *
是不可删除的,所以它是不可修改的)编辑:添加的
const
修饰符允许调用例程知道目标值不能被这个例程修改,这允许编译器基于此进行优化。(由于const void *
可能显得多余,因为void
类型不能被解引用或访问,如果你将const void *
转换为另一种指针,如果你不使用指向const
的指针,你会得到一个错误。这使得const
关键字即使对于void
类型也是可验证的。wr98u20j4#
它似乎返回不匹配的偏移量。