建议在Java到C实现中使用equalsIgnoreCase

时间:2010-11-14 01:45:22

标签: java c

所有

为了提高我的C技能,我决定开始为C代码实现各种Java库/库函数。这将确保每个人至少知道我的实现的功能。以下是模拟Java中equalsIgnoreCase() String类的C源代码的链接:C source code。我已经测试了代码,根据我的测试技巧,它看起来很好。我的目标是尽可能多地使用基本操作和数据类型。但是,如果这里的大师能够这样做会很棒:

1>给我任何改善代码质量的建议 2>任何缺少编码标准/做法的启发我 3>在我的逻辑中找到错误。

2 个答案:

答案 0 :(得分:3)

100行代码在这里发布的时间不会太长。

您计算两次字符串长度。在C中,计算字符串长度的过程从字符串的开头开始,并沿着所有字符串运行(不一定是1字节的步长),直到找到终止空字节。如果您的字符串长度为2Mbyte,则不必要地沿着4Mbyte“行走”。

<ctype.h>中的

声明了两个函数tolower()toupper()。您可以使用其中一个( tolower )而不是extractFirstCharacterASCIIVal()。使用库函数的优点是它不会被锁定到ASCII,甚至可以在“国际”时使用外来字符。

您为变量(以及函数)使用笨拙(非常长)的名称。例如:ch1ch2分别对文件1和文件2中的字符做得很好: - )

return 1;末尾的

main通常意味着程序出现问题。 return 0;是成功终止的惯用语。


编辑:与tcrosley版本进行比较

#include <ctype.h>
int cmpnocase(const char *s1, const char *s2) {
    while (*s1 && *s2) {
        if (tolower((unsigned char)*s1) != tolower((unsigned char)*s2)) break;
        s1++;
        s2++;
    }
    return (*s1 != *s2);
}

答案 1 :(得分:2)

使用C ++,您可以用stricmp替换performComparison(char * string1,char * string2)。 但是stricmp不是标准C库的一部分。这是适合您示例的版本。请注意,您不需要extractFirstCharacterASCIIVal函数,请改用tolower。另请注意,不需要提前显式计算字符串长度,因为C中的字符串由NULL字符'\ 0'终止。

int performComparison(char* string1, char * string2)
{
    char c1, c2;
    int  v;

    do {
        c1 = *string1++;
        c2 = *string2++;
        v = (UINT) tolower(c1) - (UINT) tolower(c2);
    } while ((v == 0) && (c1 != '\0') && (c2 != '\0') );

    return v != 0;
}

如果您确实想使用自己的extractFirstCharacterASCIIVal函数而不是tolower宏,为了使代码更加透明,您应该像这样编写代码:

   if ((str >= 'a') && (str <= 'z'))
   {
      returnVal = str - ('a' - 'A');
   }
   else
   {
      returnVal = str;
   }

让你更清楚自己在做什么。此外,您应该添加一个注释,假设字符a..z和A..Z是连续的。 (它们是ASCII格式,但并不总是在其他编码中。)