我正在尝试创建自己的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
发布于 2021-03-01 12:13:18
未指定strcmp和memcmp的确切返回值。如果第一个参数较少,则可以返回任何负值,如果参数更大,则返回任何正数。因此,-1、-10、-42的返回值都是相同的。
发布于 2021-03-01 13:28:15
没有指定memcmp()返回的确切值,只有符号重要,它是否为0。
但是,请注意,您的实现是不正确的,因为应该将内存的内容作为unsigned char值进行比较,而不是可能为负值的char值。
此外,表达式(*p > *q) ? (*p - *q) : (*p - *q)是多余的,您可以只编写*p - *q。
以下是修改后的版本:
int my_memcmp(const void *s1, const void *s2, size_t n) {
unsigned char *p = s1;
unsigned char *q = s2;
if (s1 == s2) { // optional.
return 0;
}
while (n --> 0) { // same as while (n-- > 0), iterating exactly n times
if (*p != *q) {
return *p - *q;
}
p++;
q++;
}
return 0;
}发布于 2021-03-02 19:55:07
Memcmp返回一个正数,如果first > second,first < second返回负数,如果两个字节序列相等,则返回0。这是按字典顺序做的,这是,函数在第一次遇到差异时决定的。
比较这两个字符串的最简单方法是:
int my_memcmp(
const unsigned char *first,
const unsigned char *second,
size_t sz)
{
while (sz--) {
int cmp = *first++ - *second++;
if (cmp == 0) continue;
/* return the difference of the first
* pair that differs */
return cmp;
}
return 0;
}如果您想维护与标准libray版本相同的原型,则需要使用void *指针,并在内部将它们转换为unsigned char *,如下所示:
int my_memcmp(
const void *_first,
const void *_second,
size_t sz)
{
const unsigned char
*first = _first,
*second = _second;
while (sz--) {
int cmp = *first++ - *second++;
if (cmp == 0) continue;
return cmp;
}
return 0;
}(您不需要使用const void *,因为void *不是不可撤销的,因此它是不可修改的)
编辑:添加的const修饰符允许调用例程知道这个例程不能修改目标值,这允许编译器在此基础上进行优化。(由于const void *可能显得多余,因为void类型不能解除引用或访问,如果将const void *转换为另一种指针,则如果也不使用指向const的指针,则会出现错误。这使得const关键字即使对于void类型也是值得推荐的。
https://stackoverflow.com/questions/66421735
复制相似问题