簡體   English   中英

關於Java to C實現中equalsIgnoreCase的建議

[英]Suggestion on equalsIgnoreCase in Java to C implementation

所有,

為了提高我的C技能,我決定開始對C代碼實現各種Java庫/庫函數。 這樣可以確保每個人至少都知道我的實現的功能。 這是模擬Java中String類的equalsIgnoreCase()的C源代碼的鏈接: C源代碼 我已經測試了代碼,按照我的測試技能來看,它看起來還不錯。 我的目標是使用盡可能多的基本操作和數據類型。 不過,如果這里的專家能夠做到,那就太好了:

1>給我任何提高代碼質量的建議
2>用任何缺少的編碼標准/做法啟發我
3>在我的邏輯中找到錯誤。

100行代碼不太長,無法在此處發布。

您計算字符串長度兩次。 在C語言中,計算字符串長度的過程從字符串的開頭開始,並沿着所有字符串(不一定以1字節為步長)運行,直到找到終止的空字節為止。 如果您的字符串長度為2Mbyte,則不必要地“遍歷” 4Mbyte。

<ctype.h> ,有兩個聲明為tolower()toupper()函數。 您可以使用其中之一( tolower )來代替extractFirstCharacterASCIIVal() 使用庫函數的優點是它不會鎖定為ASCII,甚至在您進入“國際”時也可以使用外來字符。

您為變量(以及函數)使用笨拙的名稱(很長)。 例如: ch1ch2分別對文件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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM