2010-07-17 83 views
3

比較字符串我略有困惑,並希望啓發。AnsiStrIComp未能在Delphi 2010

我使用德爾福2010年這個項目,我試圖比較兩個字符串。下面

使用代碼失敗

if AnsiStrIComp(PAnsiChar(sCatName), PAnsiChar(CatNode.CatName)) = 0 then... 

因爲根據調試器只每個字符串的第一個字符被比較(即,如果sCatName"Automobiles"PAnsiChar(sCatName)"A")。

我希望能夠比較字符串,可能是在不同的語言,例如英語VS日本。

在這種情況下,我找了比賽,但我有用於排序等其他功能,我需要知道如何字符串比較(小於,等於,大於)。

+0

sCatName被定義爲字符串,這在我的Delphi 2010中理解的是= UnicodeString。 在這種特殊情況下,它正在傳遞一個函數參數 - 函數ExtractCatagory2Listbox(sCatName:String; TargetLB:TListBox):Boolean; – TheSteven 2010-07-17 15:46:51

回答

5

我假設sCatNameCatNode.CatName被定義爲string s(= UnicodeString s)?.他們應該是。

沒有必要將字符串轉換爲空值終止字符串!這個你(大部分)只需要在使用Windows API時完成。

如果你想測試兩個字符串的平等,使用SameStr(S1, S2)(區分大小寫匹配)或SameText(S1, S2)(不區分大小寫的匹配),或在第一種情況下簡單地S1 = S2。所有三個選項返回truefalse,具體取決於字符串是否相等。

如果您想根據字符的序數值(如在排序中)獲取數值,請使用CompareStr(S1, S2)CompareText(S1, S2)。這些返回一個負整數,零或一個正整數。

(您可能需要使用Ansi-功能:AnsiSameStrAnsiSameTextAnsiCompareStrAnsiCompareText,這些功能將使用當前區域設置的非Ansi-功能將接受第三個可選參數,明確指定要使用的語言環境。 )

更新

請閱讀Remy Lebeau關於問題原因的評論。

+0

感謝您的回覆。 對於有問題的函數AnsiCompareText()看起來像它會做這個工作,並且是一個更簡單的實現。 但我想知道爲什麼PAnsiChar(sCatName)正在接受一個字符串變量並只返回第一個字符。 – TheSteven 2010-07-17 15:18:45

+0

如果'sCatName'是一個字符串,那麼'PAnsiChar(sCatName)'創建一個以sCatName結尾的以空字符結尾的字符串表示形式,並返回該空終止字符串的第一個字符的指針地址。(在Delphi中,'string's * not * null-terminated,所以例如在與Windows API進行通信時,可能需要從Delphi字符串中創建以null結尾的字符串)。 – 2010-07-17 15:24:23

+0

感謝您的快速和詳細的迴應:) – TheSteven 2010-07-17 15:37:05

0

什麼簡單sCatName=CatNode.CatName?如果他們是strings它應該工作。

+0

我在尋找不區分大小寫的比較。在這種特殊情況下,我正在檢查平等。雖然UpperCase(sCatName)= UpperCase(CatNode.Name)可以工作(對於這個特定的例子),但我的理解是內置的字符串比較函數更快。 – TheSteven 2010-07-17 15:23:42

+0

@TheSteven:是的,'SameText(A,B)'比'AnsiUpperCase(A)= AnsiUpperCase(B)'快。 – 2010-07-17 15:28:05

+0

所以'AnsiSameText(A,B)' – 2010-07-17 19:45:49