【发布时间】:2009-05-01 15:43:06
【问题描述】:
memcmp C 实现 - 这个有任何逻辑错误吗?
我正在寻找memcmp()的实现,我找到了这个代码sn-p,但它清楚地标明了代码sn-p存在1个逻辑错误。你能帮我找出逻辑错误吗?
基本上,我用不同的输入针对 memcmp() 的 string.h 库实现测试了这段代码,但预期的输出始终与函数的库版本相同。
这里是sn-p的代码:
#include <stdio.h>
#include <string.h>
int memcmp_test(const char *cs, const char *ct, size_t n)
{
size_t i;
for (i = 0; i < n; i++, cs++, ct++)
{
if (*cs < *ct)
{
return -1;
}
else if (*cs > *ct)
{
return 1;
}
else
{
return 0;
}
}
}
int main()
{
int ret_val = 20; //initialize with non-zero value
char *string1 = "china";
char *string2 = "korea";
ret_val = memcmp_test(string1,string2,5);
printf ("ret_val is = %d",ret_val);
getchar();
return 0;
}
我用两个示例字符串运行程序,程序将在比较两个字符串的第一个字符后返回。在上述情况下,ret_val 为 -1。
上面的代码sn-p应该符合的memcmp()的定义是:
'C'库函数memcmp的定义是 int memcmp(const char *cs, const char *ct, size_t n)
比较cs的前n个字符和ct的前n个字符。 如果 cs ct,则返回 > 0。 如果 cs == ct,则返回 0。
肯定有LOGICAL错误,你能帮我找出来吗?
【问题讨论】:
-
这是作业吗?我只想说看看'return 0'的情况,想想它在什么时候做了什么。
-
还请注意 mehrdad 的回答。或做 (unsigned char)*cs
-
hmm,虽然我认为即使 (unsigned char)*cs -1) 会高于 0x82 (=> -2)。但实际上当解释为无符号字符时,0x81 当然小于 0x82。所以我想正确/便携的唯一方法可能是按照 mehrdad 显示或执行 (unsigned char)cs (unsigned char)ct 。那是一只狡猾的野兽!
-
@JohannesSchaub-litb:或者更明显的是,比较 +0 和 -0 相等:)
标签: c