You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi遍历TSysCharSet实现字符串指定位置字符有效性校验

问题说明

原代码编译失败的核心原因有两点:

  • TSysCharSet是Delphi原生集合类型,不支持for each in语法直接遍历
  • 字符串取字符的语法写错:Delphi中访问字符串指定位置索引用[],不是(),且代码未使用传入的CheckPos参数,也未做边界校验,存在逻辑错误和越界风险。
最优实现(无需遍历)

集合类型原生支持in运算符直接判断元素归属,不需要手动遍历集合,性能最高,代码如下:

function Valid_Char_at_Index(const CheckStr: string; CheckPos : Integer ; ValidNextChars: TSysCharSet)
  : boolean;
begin
  Result := False;
  // 校验位置合法性,避免越界
  if (CheckPos < 1) or (CheckPos > Length(CheckStr)) then
    Exit;
  // 直接判断目标字符是否在有效字符集内
  Result := CheckStr[CheckPos] in ValidNextChars;
end;
手动遍历TSysCharSet的正确写法

如果有遍历集合内所有字符的需求,不能用for each语法,需要遍历字符类型的完整取值范围,逐个判断字符是否属于当前集合,示例代码如下:

function Valid_Char_at_Index(const CheckStr: string; CheckPos : Integer ; ValidNextChars: TSysCharSet)
  : boolean;
var
  mychar : Char;
  TargetChar: Char;
begin
  Result := False;
  // 边界校验
  if (CheckPos < 1) or (CheckPos > Length(CheckStr)) then
    Exit;
  TargetChar := CheckStr[CheckPos];

  // 遍历所有可能的字符值,判断是否在集合内
  for mychar := Low(Char) to High(Char) do
  begin
    if (mychar in ValidNextChars) and (mychar = TargetChar) then
    begin
      Result := True;
      Exit; // 匹配到直接返回,终止遍历
    end;
  end;
end;

版本适配提示:Delphi 2009之前的版本中TSysCharSet定义为set of AnsiChar,仅支持0-255范围的ANSI字符;后续Unicode版本中TSysCharSet对应宽字符集合,遍历范围随Char类型自动适配即可。

内容的提问来源于stack exchange,提问作者Franz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:30:46