【发布时间】:2016-05-12 15:27:35
【问题描述】:
所以我必须使用 C 重新创建 memcmp() 函数,并且我的函数按预期工作。它返回两个字符串中不匹配的第一个字符的差异。
我的功能:
int ft_memcmp(const void *s1, const void *s2, size_t n)
{
unsigned char *ptr1;
unsigned char *ptr2;
ptr1 = (unsigned char *)s1;
ptr2 = (unsigned char *)s2;
while (n && (*ptr1 == *ptr2))
{
ptr1++;
ptr2++;
n--;
}
if (n == 0)
return (0);
else
return (*ptr1 - *ptr2);
}
我的主要:
int main(void)
{
const char *s1 = "acc";
const char *s2 = "abc";
int res;
res = memcmp(s1, s2, 3);
printf("%i\n", res);
return (0);
}
所以这个main会返回256,但是如果你使用我的函数(ft_memcmp)你得到1。显然区别是1而不是256,但是为什么原来的函数返回256?差为 2,我得到 512...
【问题讨论】:
-
注意:
return是一个语句,而不是一个函数。您使用的括号是表达式的一部分,而不是语句的一部分。声明不需要它们。不建议将它们用于简单的表达,因为它们会使阅读变得复杂。 -
好的,公平的评论。我完全同意。然而,我的大学使用了一种叫做“规范”的东西,它要求我们在使用“返回”时加上括号,以及关键字和括号之间的空格。例如,'while ()' 而不是 'while()'....
-
@Olaf 这是您的个人意见。让我们在这里关注问题的技术方面,即使您很少会看到 return (0),我同意它应该读为 return 0,很明显。
-
*ptr1 - *ptr2将在使用相同大小的unsigned char和unsigned的平台(例如某些图形处理器)上提供错误的符号答案,因为数学溢出。(*ptr1 > *ptr2) - (*ptr1 < *ptr2)是一个惯用的替代品.. -
*ptr1 - *ptr2和(保持指针不变,但增加索引)ptr1[some_int] - ptr2[some_int]是相同的。所以不要认为这是对(*ptr1 > *ptr2) - (*ptr1 < *ptr2)的改进。