function NextToken( P : PChar ; Divider : PChar ) : PChar ;
const
next : PChar = nil ;
beginif P = nilthen
P := next ;
if P <> nilthenbegin
next := StrPos( P, Divider ) ;
if next <> nilthenbegin
next^ := #0 ;
next := @next[ StrLen( Divider ) ] ;
end ;
end ;
NextToken := P ;
end ;
Here's the translation of the text into Russian:
Это реализация функции StrTok на языке Delphi, которая разбивает строку на токены, разделенные заданным символом-разделителем. Автор - Майк Скотт.
Код определяет функцию NextToken, которая принимает два параметра: P, указатель на строку символов (типа PChar), и Divider, указатель на символ-разделитель (также типа PChar). Функция возвращает указатель на следующий токен в строке, или nil, если больше нет токенов.
Вот шаг за шагом, что код делает:
Если P равно nil, то он устанавливает P в внутреннюю переменную next. Это позволяет функции работать рекурсивно, как мы увидим позже.
Если P не равно nil, то он находит позицию символа-разделителя в строке с помощью StrPos.
Если символ-разделитель найден, то он устанавливает символ на этой позиции в null-символ (#0) для обозначения конца токена. Затем он перемещает указатель next на позицию после символа-разделителя, эффективно пропуская символ-разделитель и готовясь к следующей итерации.
Функция возвращает значение P, которое теперь указывает на следующий токен в строке.
Код использует рекурсивный подход для поиска каждого последующего токена. Когда он достигает конца входной строки, он устанавливает P в nil, что вызывает функцию вернуться сразу и прекратить рекурсию.
Вот пример использования этой функции:
var
s: string;
begin
s := 'hello,world!';
PChar(s) := ' ';
while NextToken(PChar(s), ' ') <> nil do
begin
writeln(NextToken(PChar(s), ' '));
NextToken(PChar(s), ' '); // перемещаемся к следующему токену
end;
end.
Этот код выведет токены "hello", "world!", а затем остановится, потому что больше нет токенов.
В качестве альтернативы можно использовать функцию Split из модуля System.SysUtils в Delphi:
var
s: string;
begin
s := 'hello,world!';
writeln(s.Split(['',']))); // выведет ['hello', 'world!']
end.
Это более компактный и эффективный способ разбить строку на токены, но может не быть совместимым с более старыми версиями Delphi или другими Паскальскими компиляторами.
Функция NextToken реализует Паскалевский эквивалент функции StrTok, позволяя разделить строку на токены с помощью указанного делителя.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.