关于Java到C实现中equalsIgnoreCase的建议
全部, 为了提高我的C技能,我决定开始在C代码中实现各种Java库/库函数。这将确保每个人至少都知道我的实现的功能。下面是指向模拟Java中类的关于Java到C实现中equalsIgnoreCase的建议,java,c,Java,C,全部, 为了提高我的C技能,我决定开始在C代码中实现各种Java库/库函数。这将确保每个人至少都知道我的实现的功能。下面是指向模拟Java中类的equalsIgnoreCase()的C源代码的链接:。我已经测试了代码,根据我的测试技巧,它看起来很好。我的目标是尽可能多地使用基本操作和数据类型。不过,如果这里的大师能够: 1>给我任何改善代码质量的建议 2>告诉我任何缺少的编码标准/实践 3>查找我的逻辑中的错误 100行代码在这里发布并不太长 您可以计算两次字符串长度。在C语言中,计算字符串长度
equalsIgnoreCase()
的C源代码的链接:。我已经测试了代码,根据我的测试技巧,它看起来很好。我的目标是尽可能多地使用基本操作和数据类型。不过,如果这里的大师能够:
1>给我任何改善代码质量的建议2>告诉我任何缺少的编码标准/实践
3>查找我的逻辑中的错误 100行代码在这里发布并不太长 您可以计算两次字符串长度。在C语言中,计算字符串长度的过程从字符串的开头开始,并沿着字符串的所有部分(不一定以1字节为单位)运行,直到找到终止的空字节。如果字符串的长度为2M字节,则不必要地“走”4MB 在
中声明了两个函数tolower()
和toupper()
。您可以使用其中一个(tolower)代替extractFirstCharacterAscival()
。使用库函数的优点是,它不锁定在ASCII中,甚至可以在使用“国际”时使用外来字符
您对变量(以及函数)使用了笨拙(非常长)的名称。例如:ch1
和ch2
分别适用于文件1和文件2中的字符:-)
返回1在main
末尾的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中的字符:-)
返回1在main
末尾的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这样的二进制搜索