Эквивалент подстроки Паскаля

Я искал эквивалент Pascal для (например) функции substr php, которая работает следующим образом:

$new_string = substr('abcdef', 1, 3);  // returns 'bcd'

Я уже нашел его, но мне всегда требуется слишком много времени, поэтому я публикую ответ, чтобы другие, такие как я, могли легко его найти.


person Michael Konečný    schedule 03.09.2012    source источник


Ответы (3)


Вы можете использовать функцию копировать . Синтаксис идет:

copy(string, start, length);

Строки в Паскале, кажется, индексируются, начиная с 1, поэтому следующее:

s1 := 'abcdef';
s2 := copy(s1, 2, 3);

приведет к s2 == 'BCD'.

Надеюсь, это поможет кому-то.

person Michael Konečný    schedule 03.09.2012
comment
К вашему сведению, причина, по которой строки Pascal индексируются с 1, заключается в том, что байт с индексом 0 содержит длину строки, то есть s1 будет иметь 6 с индексом 0, за которым следуют символы abcdef с индексами 1..6. Это устанавливает верхний предел в 255 длин строк Паскаля. - person Paul R; 04.09.2012
comment
@PaulR: место хранения длиной 0 байта и ограничение в 255 символов отсутствуют в современных компиляторах Pascal уже более десяти лет. (Например, FreePascal поддерживает длинные строки размером до 2 ГБ.) 0th байта были заменены подсчетом ссылок и другой информацией, которая хранится с отрицательным смещением от адреса первого байта. - person Ken White; 04.09.2012
comment
@Ken: спасибо за обновление - я освоил Паскаль еще в начале 1980-х, но не использовал его очень-очень давно, как вы можете сказать. ;-) - person Paul R; 04.09.2012
comment
@PaulR: Тогда вы будете очень удивлены Delphi. :-) Он поддерживает дженерики, замыкания, интерфейсы и Unicode, полностью ООП и ориентирован на Win32/64 и OSX. - person Ken White; 04.09.2012
comment
Я мельком взглянул на Delphi (опять же, давно) - я не знал, что Delphi работает ни с чем, кроме Windows (обычно я избегаю Windows), поэтому, возможно, придется взглянуть... - person Paul R; 04.09.2012

Freepascal также имеет функцию копирования:

T:='1234567';
S:=Copy (T,1,2);   { S:='12'   }
S:=Copy (T,4,2);   { S:='45'   }
S:=Copy (T,4,8);   { S:='4567' }

Я рекомендую вам ознакомиться с Lazarus IDE.

person Miguel Risco-Castillo    schedule 21.02.2018

person    schedule
comment
Возможно, добавьте немного дополнительных объяснений, почему это правильный ответ. - person ThomasVdBerge; 18.08.2015