我需要驗證字串中的某個位置是否是給定有效字符集的一部分。我的代碼無法編譯,如何遍歷字符集?
function Valid_Char_at_Index(const CheckStr: string; CheckPos : Integer ; ValidNextChars: TSysCharSet)
: boolean;
var
mychar : Char;
begin
Result := false;
for each mychar in ValidNextChars do
if (CheckStr(Length(CheckStr)) =mychar ) then
Result:= True;
end;
uj5u.com熱心網友回復:
首先,不清楚為什么你會期望for each作業,因為 Delphi 沒有for each回圈,如檔案中所述。檔案或簡單的 WWW 搜索顯示相應的 Delphi 概念是for in回圈。
其次,我完全不明白你的意思CheckStr(Length(CheckStr)) = mychar。謂詞肯定需要包含字符索引嗎?這是一個語法錯誤,因為CheckStr它不是函式或型別。實際上,您只是想檢查CheckPosth 字符CheckStr是否為mychar。
把所有這些放在一起,我們最終得到
function CheckCharAt(const AText: string; APos: Integer; ValidChars: TSysCharSet): Boolean;
var
ValidChar: Char;
begin
for ValidChar in ValidChars do
if AText[APos] = ValidChar then
Exit(True);
Result := False;
end;
但請注意,這只適用于 ASCII(和 8 位字符集),所以基本上只適用于非印刷英文,因為它TSysCharSet是 a set of AnsiChar-- 并且 aset of WideChar是一種不可能的型別(因為SizeOf(WideChar) = 2 > 1)。
解決此問題的一種簡單方法是改用字符陣列:
function CheckCharAt(const AText: string; APos: Integer; const ValidChars: array of Char): Boolean;
begin
for var ValidChar in ValidChars do
if AText[APos] = ValidChar then
Exit(True);
Result := False;
end;
但在現代 Delphi 版本中,您根本不需要撰寫自己的函式,因為您可以簡單地使用以下TCharHelper.IsInArray方法:
'test'[2].IsInArray(['a', 'e'])
額外資訊:如果您只使用AnsiStrings(或僅 ASCII strings),您當然應該使用setin運算子:
function CheckCharAt(const AText: AnsiString; APos: Integer; const ValidChars: TSysCharSet): Boolean;
begin
Result := AText[APos] in ValidChars;
end;
但是,正如我上面所說,一組WideChar是不可能的,所以set如果您需要超過 8 位字符,則必須放棄整個概念。
uj5u.com熱心網友回復:
你不需要迭代。使用CharInSet().
function Valid_Char_at_Index(const CheckStr: string; CheckPos : Integer ; ValidNextChars: TSysCharSet)
: boolean;
begin
Result := CharInSet(CheckStr[CheckPos],ValidNextChars);
end;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/496407.html
標籤:德尔福
