delphi 如果代码正确,为什么会出现范围检查错误?

xiozqbni  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(165)
unit Unit1;

interface

uses
  System.Classes, Vcl.Controls, Winapi.Messages, System.SysUtils, System.Variants, Vcl.Graphics,
  Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,System.StrUtils;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
  Cnt:integer;
  s:string;
begin
  Cnt := 0;
  s := Edit1.Text;
  for i := 0 to Length(s) do
    if s[i] =  '.' then
       Cnt := Cnt + 1;
  ShowMessage(IntToStr(Cnt));
end;

end.

在执行上述代码后,如果我试图找出有多少个,则会发生范围检查错误。
我在查例题,不知道是不是代码有问题?
这个例子使用了一个TEdit,我打算用一个TButton来创建它。

mrwjdhj3

mrwjdhj31#

问题就在这里:

for i := 0 to Length(s) do

因为一些原因:
string字符的编号从1Length(s),因此长度为3的字符串的有效索引为s[1], s[2], s[3],并且您对s[0]的调用导致范围检查错误。
Delphi /Pascal for循环包括下限值和上限值,因此此代码尝试使Length(s) + 1运行,而不是Length(s)
Instances of UnicodeString can index characters. Indexing is 1-based, just as for AnsiString.,same表示除PChar系列之外的其他字符串类型。
(还有很少使用的编译器选项{$ZEROBASEDSTRINGS}

相关问题