关于Java到C实现中equalsIgnoreCase的建议

关于Java到C实现中equalsIgnoreCase的建议,java,c,Java,C,全部, 为了提高我的C技能,我决定开始在C代码中实现各种Java库/库函数。这将确保每个人至少都知道我的实现的功能。下面是指向模拟Java中类的equalsIgnoreCase()的C源代码的链接:。我已经测试了代码,根据我的测试技巧,它看起来很好。我的目标是尽可能多地使用基本操作和数据类型。不过,如果这里的大师能够: 1>给我任何改善代码质量的建议 2>告诉我任何缺少的编码标准/实践 3>查找我的逻辑中的错误 100行代码在这里发布并不太长 您可以计算两次字符串长度。在C语言中,计算字符串长度

全部,

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

1>给我任何改善代码质量的建议
2>告诉我任何缺少的编码标准/实践

3>查找我的逻辑中的错误

100行代码在这里发布并不太长

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

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

您对变量(以及函数)使用了笨拙(非常长)的名称。例如:
ch1
ch2
分别适用于文件1和文件2中的字符:-)

返回1main
末尾的code>通常表示程序出了问题<代码>返回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);
}
#包括
int cmpnocase(常量字符*s1,常量字符*s2){
而(*s1&&*s2){
如果(tolower((无符号字符)*s1)!=tolower((无符号字符)*s2))中断;
s1++;
s2++;
}
返回(*s1!=*s2);
}

100行代码在这里发布并不太长

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

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

您对变量(以及函数)使用了笨拙(非常长)的名称。例如:
ch1
ch2
分别适用于文件1和文件2中的字符:-)

返回1main
末尾的code>通常表示程序出了问题<代码>返回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);
}
#包括
int cmpnocase(常量字符*s1,常量字符*s2){
而(*s1&&*s2){
如果(tolower((无符号字符)*s1)!=tolower((无符号字符)*s2))中断;
s1++;
s2++;
}
返回(*s1!=*s2);
}

<代码> > p>用C++,可以将性能比较(char *STRIG1,CHAR*STRIG2)替换为StrutMP。 但是,stricmp不是标准C库的一部分。下面是一个适合您的示例的版本。注意:您不需要ExtractFirstCharacterAscival函数,而是使用tolower。还请注意,不需要提前显式计算字符串长度,因为C中的字符串以空字符“\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;
}
如果要使用自己的ExtractFirstCharacterAscival函数而不是tolower宏,使代码更透明,则应按如下方式编码:

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

<代码>((STR>=‘a’)& &(STR

C++),可以将性能比较(CHAR*STRIG1,CHAR*STRIG2)替换为StrutMP。 但是,stricmp不是标准C库的一部分。下面是一个适合您的示例的版本。请注意,您不需要ExtractFirstCharacterAscival函数,而是使用tolower。另外请注意,不需要提前显式计算字符串长度,因为C中的字符串以空字符“\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;
}
如果要使用自己的ExtractFirstCharacterAscival函数而不是tolower宏,使代码更透明,则应按如下方式编码:

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

if((str>='a')&&(str,谢谢你。正如我所说,“我的目标是尽可能多地使用基本操作和数据类型”。我知道
tolower()
toupper()
并故意避开它们。我也应该编写一个计算长度的函数。strlen如何使用大于1字节的步长?据我所知,你不能使用Boyer Moore。如果你尝试类似二进制搜索的方法,发现strlen(x)/2是0,你不是还要检查0..n之间的每个字节才能找到终止的空值吗?编辑:哦,你的意思是它可以在字而不是字节上运行吗?@ACoolie:显然libc的步骤是8个字节宽…()@tcrosley:我们现在有了一个
do-while
和一个
while
版本。我将梦想一个
for
版本,明天发布:)谢谢。正如我说过的,“我的目标是尽可能多地使用基本操作和数据类型”。我知道
tolower()
toupper())
并故意避免使用它们。我也应该编写一个计算长度的函数。斯特伦如何使用大于1字节的步长?据我所知,你不能使用Boyer Moore进行此操作。如果你尝试像meth这样的二进制搜索