memcmp C实现 – 与此相关的任何逻辑错误

memcmp C实现 – 这个有任何逻辑错误吗?

我正在寻找memcmp()的实现,我找到了这段代码片段,但是它清楚地标明了代码片段有1个逻辑错误。 你能帮我找到逻辑错误吗?

基本上,我使用不同的输入对memcmp()的string.h库实现测试了此代码,但是预期的输出始终与函数的库版本相同。

这是代码片段:

#include  #include  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 { 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。

上面的代码片段应该符合的memcmp()的定义是:

‘C’库函数memcmp的定义是int memcmp(const char * cs,const char * ct,size_t n)

将cs的前n个字符与ct的前n个字符进行比较。 如果cs <ct,则返回 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; } 

我想因为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; } 

看看你的循环。 它只检查一个角色。

严格来说签名是错误的。 正确的是:

 int memcmp(const void *s1, const void *s2, size_t n); 

您的代码比较ck并且在发现c小于k尽职地返回-1。 但是,如果这两个相等,那么由于您提前返回,因此会得到错误的结果。

如果您阅读了文档,您会发现:

非零返回值的符号应由第一对字节值(均被解释为unsigned char类型)的值之间的差异的符号确定,这些值在被比较的对象中不同

这基本上意味着你通过返回保留('c' - 'k')符号的东西来做正确的事情。

这里可以找到更简单的实现。

返回0; 仅在比较第一个字符后发生。 它应该放在循环外面。

这个片段对我来说非常适合!!

 #include  #include  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; } } return 0; } int main() { int ret_val = 20; //initialize with non-zero value const char *string1 = "DWgaOtP12df0"; const char *string2 = "DWGAOTP12DF0"; ret_val = memcmp_test(string1,string2,5); printf ("ret_val is = %d",ret_val); getchar(); return 0; }