我正在嘗試在不使用內置函數的情況下編寫自定義strcmp()函數。到目前爲止,我的代碼感覺有些複雜。基本上我想字符的順序是這樣的:沒有strcmp()的字母比較?
- 特殊字符(他們的順序出現)
- 號
- 字母字符,在順序,但首都首,即「AABBCCDD」
如果string1出現在string2之前,則返回1;如果string2出現在string1之前,則返回-1;如果相等,則返回0。
這裏是我的代碼:
int strcmp(char * string1, char * string2)
{
while((*string1 != '\0') && (*string2 != '\0') && (*string1 == *string2))
{
++string1;
++string2;
}
//If both are now zero, they are equal
if (*string1 == *string2 == '\0') { return 0; }
//If string1 is comes before, return 1
//If string2 is comes before, return -1
int type1 = (isalpha(string1) ? 2 : (isnum(string1) ? 1 : 0))
int type2 = (isalpha(string2) ? 2 : (isnum(string2) ? 1 : 0))
return ((type1 < type2) 1 : ((type2 < type1) -1 :
(((*string1 >= 'a') ? (*string1 - 'a')*2+1 : (*string1 - 'a')*2) <
((*string2 >= 'a') ? (*string2 - 'a')*2+1 : (*string2 - 'a')*2) ? 1 : -1)));
}
有兩件事情我不知道:
- 無論分配「類別」是正確的做法。現在我將類型0分配給特殊字符,將數字鍵入1並將字母鍵入類型2。這樣我可以快速比較類型。
- 我的使用代數運算的方法是否適合建立字母順序的字符。
這些好方法嗎?有更好的嗎?請記住我正在爲效率最大化。
爲什麼不是你的因素比較標準了,只是做一個函數'compare_chars( char a,char b)',然後就返回那個?另外不要忘記測試一個字符串比另一個字符串短的情況。 – 2011-06-16 16:14:28
比較(* string1 == * string2 =='\ 0')不正確 - * string1 == * string2的結果將爲0或1,然後將其與零字節進行比較,在所有你想要的。你實際上需要做(* string1 == * string2 && * string1 =='\ 0')。 – chrisdowney 2011-06-16 16:21:32
你應該看看strcmp的一些現有實現。例如glibc或PJ Plauger(前兩個想到的)。還要學習如何實現isalpha()和其他宏。 – 2011-06-16 16:28:03