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);
您的代码比较c
和k
并且在发现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; }