[英]Suggestion on equalsIgnoreCase in Java to C implementation
100行代碼不太長,無法在此處發布。
您計算字符串長度兩次。 在C語言中,計算字符串長度的過程從字符串的開頭開始,並沿着所有字符串(不一定以1字節為步長)運行,直到找到終止的空字節為止。 如果您的字符串長度為2Mbyte,則不必要地“遍歷” 4Mbyte。
在<ctype.h>
,有兩個聲明為tolower()
和toupper()
函數。 您可以使用其中之一( tolower )來代替extractFirstCharacterASCIIVal()
。 使用庫函數的優點是它不會鎖定為ASCII,甚至在您進入“國際”時也可以使用外來字符。
您為變量(以及函數)使用笨拙的名稱(很長)。 例如: ch1
和ch2
分別對文件1和文件2中的字符非常ch2
:-)
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);
}
使用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,但並非始終使用其他編碼。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.