-2 c
memcmp C实现 - 这个有任何逻辑错误吗?
我正在寻找memcmp()的实现,我找到了这段代码片段,但它清楚地标明代码片段有1个逻辑错误.你能帮我找到逻辑错误吗?
基本上,我使用不同的输入对memcmp()的string.h库实现测试了此代码,但预期的输出始终与函数的库版本相同.
这是代码片段:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我使用两个示例字符串运行程序,程序将在比较两个字符串的第一个字符后返回.在上述情况下,ret_val为-1.
上面的代码片段应该符合的memcmp()的定义是:
'C'库函数memcmp的定义是int memcmp(const char*cs,const char*ct,size_t n)
将cs的前n个字符与ct的前n个字符进行比较.如果cs <ct,则返回<0.如果cs> ct,则返回> 0.如果cs == ct,则返回0.
肯定有LOGICAL错误,你能帮我找到吗?
正如现在所写,这段代码只会测试输入的第一个字节.该else return 0
需求被移出循环,留return 0
在最后:
for (i = 0; i < n; i++, cs++, ct++)
{
if (*cs < *ct)
{
return -1;
}
else if (*cs > *ct)
{
return 1;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想因为char
签名是实现定义的,你可以进行比较unsigned
:
int memcmp_test(const char *cs_in, const char *ct_in, size_t n)
{
size_t i;
const unsigned char * cs = (const unsigned char*) cs_in;
const unsigned char * ct = (const unsigned char*) ct_in;
for (i = 0; i < n; i++, cs++, ct++)
{
if (*cs < *ct)
{
return -1;
}
else if (*cs > *ct)
{
return 1;
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)