全,
为了提高我的C语言技能,我决定开始将各种Java库/库函数实现为C代码。这将确保每个人至少知道我的实现的功能。下面是模拟Java中String类的equalsIgnoreCase()的C源代码的链接:C source code。我已经测试了代码,根据我的测试技能,它看起来很好。我的目标是使用尽可能多的基本操作和数据类型。不过,如果这里的古鲁们能:
1>给我任何改善代码质量的建议
2>请告诉我任何缺少的编码标准/实践
3>在我的逻辑中定位错误。
发布于 2010-11-14 10:26:31
使用C++,您可以用performComparison替换stricmp ( char * string1,char* string2)。但是,stricmp不是标准C库的一部分。以下是适用于您的示例的版本。注意,您不需要extractFirstCharacterASCIIVal函数,而是使用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;
}如果您确实想使用自己的extractFirstCharacterASCIIVal函数而不是tolower宏,以使代码更透明,那么您应该像这样编写代码:
if ((str >= 'a') && (str <= 'z'))
{
returnVal = str - ('a' - 'A');
}
else
{
returnVal = str;
}让你的所作所为变得更明显。此外,您还应该包括一条注释,该注释假定字符a..z和A..Z是连续的。(它们采用ASCII,但并不总是采用其他编码。)
发布于 2010-11-14 10:14:28
在这里发布100行代码并不算太长。
计算字符串长度两次。在C中,计算字符串长度的过程从字符串的开头开始,并沿着字符串的所有部分运行(不一定以1字节为步长),直到找到终止的空字节。如果你的字符串有2M字节长,你就不必要地沿着4M字节“走”了。
在<ctype.h>中,声明了两个函数tolower()和toupper()。你可以使用其中的一种(或者)来代替extractFirstCharacterASCIIVal()。使用库函数的好处是,它不会被锁定在ASCII中,甚至可以在“国际化”时处理外国字符。
你对你的变量(和函数)使用了笨拙的(非常长的)名称。例如:ch1和ch2分别适用于文件1和文件2中的字符:-)
main末尾的return 1;通常表示程序出了问题。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);
}https://stackoverflow.com/questions/4175741
复制相似问题