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来创建它。
1条答案
按热度按时间mrwjdhj31#
问题就在这里:
因为一些原因:
string
字符的编号从1
到Length(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}
)