首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于Java to C实现equalsIgnoreCase的几点建议

关于Java to C实现equalsIgnoreCase的几点建议
EN

Stack Overflow用户
提问于 2010-11-14 09:45:22
回答 2查看 989关注 0票数 1

全,

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

1>给我任何改善代码质量的建议

2>请告诉我任何缺少的编码标准/实践

3>在我的逻辑中定位错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-14 10:26:31

使用C++,您可以用performComparison替换stricmp ( char * string1,char* string2)。但是,stricmp不是标准C库的一部分。以下是适用于您的示例的版本。注意,您不需要extractFirstCharacterASCIIVal函数,而是使用tolower函数。还要注意,不需要提前显式计算字符串长度,因为C中的字符串以空字符'\0‘结尾。

代码语言:javascript
复制
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宏,以使代码更透明,那么您应该像这样编写代码:

代码语言:javascript
复制
   if ((str >= 'a') && (str <= 'z'))
   {
      returnVal = str - ('a' - 'A');
   }
   else
   {
      returnVal = str;
   }

让你的所作所为变得更明显。此外,您还应该包括一条注释,该注释假定字符a..z和A..Z是连续的。(它们采用ASCII,但并不总是采用其他编码。)

票数 2
EN

Stack Overflow用户

发布于 2010-11-14 10:14:28

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

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

<ctype.h>中,声明了两个函数tolower()toupper()。你可以使用其中的一种(或者)来代替extractFirstCharacterASCIIVal()。使用库函数的好处是,它不会被锁定在ASCII中,甚至可以在“国际化”时处理外国字符。

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

main末尾的return 1;通常表示程序出了问题。return 0;是成功终止的惯用法。

编辑:与tcrosley版本进行比较

代码语言:javascript
复制
#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);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4175741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档