if s[i] in ['A','B','E','F'] then пишет Ошибка времени выполнения: Индекс находился вне границ массива. Как исправить?

program z1;
var s:string;
i,L,maxL:integer;
begin
readln(s);
L:=0;
maxL:=0;
for i:=0 to length (s) do
  if s[i] in ['A','B','E','F'] then
  begin
    L:=L+1;
    if L>maxL then
      maxL:=L;
  end
  else
    L:=0;
  writeln(maxL);
end.

Ответы (2 шт):

Автор решения: Alex_Skvortsov

Ошибка кроется в этой строчке:

for i:=0 to length (s) do

Почему так происходит:

Пусть есть строка "АБВ"

У нее есть символы с номерами 0 ("А"), 1 ("Б"), 2 ("В")

А длина для нее 3

То есть вы внутри цикла пытаетесь обратиться к символу с номером 3, а есть только номер 2. Потому и

Индекс находится вне границ массива

Исправляется легко:

for i:=0 to (length (s) - 1) do

UPD:

Непосредственно Паскалем не занимался уже оооочень давно, так что, ориентируясь на другой ответ, правильным будет такое решение:

for i:=1 to length (s) do
→ Ссылка
Автор решения: Igor

Индексация строк в Паскале начинается с единицы:

for i := 1 to Length(s) do
→ Ссылка