所有
为了提高我的C技能,我决定开始为C代码实现各种Java库/库函数。这将确保每个人至少知道我的实现的功能。以下是模拟Java中equalsIgnoreCase()
String类的C源代码的链接:C source code。我已经测试了代码,根据我的测试技巧,它看起来很好。我的目标是尽可能多地使用基本操作和数据类型。但是,如果这里的大师能够这样做会很棒:
1>给我任何改善代码质量的建议 2>任何缺少编码标准/做法的启发我 3>在我的逻辑中找到错误。
答案 0 :(得分:3)
100行代码在这里发布的时间不会太长。
您计算两次字符串长度。在C中,计算字符串长度的过程从字符串的开头开始,并沿着所有字符串运行(不一定是1字节的步长),直到找到终止空字节。如果您的字符串长度为2Mbyte,则不必要地沿着4Mbyte“行走”。
<ctype.h>
中的声明了两个函数tolower()
和toupper()
。您可以使用其中一个( tolower )而不是extractFirstCharacterASCIIVal()
。使用库函数的优点是它不会被锁定到ASCII,甚至可以在“国际”时使用外来字符。
您为变量(以及函数)使用笨拙(非常长)的名称。例如:ch1
和ch2
分别对文件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格式,但并不总是在其他编码中。)