Аналог explode из PHP

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
metallic
незнакомец
Сообщения: 9
Зарегистрирован: 24.11.2006 16:20:07

Аналог explode из PHP

Сообщение metallic »

есть ли во фрипаскале такая функция как в PHP которая разивает строку в массив по подстроке. Например есть строка a^b^c^d ее нужно разбить в массив по символу ^
Соответственно элементами массива будут a, b, c, d
Аватара пользователя
alexs
долгожитель
Сообщения: 4067
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

а зачем тут функция - тут три строки кода - вызов Pos и цикл
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Код: Выделить всё

type
  TStringArr = array of string;

так:

Код: Выделить всё

function explode(Delim: Char; const S: string): TStringArr;
var i, k, Len, Count: Integer;
begin
  Len := Length(S);
  Count := 0;
  k := 1;
  for i := 1 to Len do
  begin
    if S[i] = Delim then
    begin
      Inc(Count);
      SetLength(Result, Count);
      SetString(Result[Count-1], PChar(@S[k]), i-k);
      k := i + 1;
    end; // if
  end; // for i
  Inc(Count);
  SetLength(Result, Count);
  SetString(Result[Count-1], PChar(@S[k]), Len-k+1);
end;
или так

Код: Выделить всё

function explode(Delim: Char; const S: string): TStringArr;
var i, k, Len, Count: Integer;
begin
  Len := Length(S);
  Count := 0;
  for i := 1 to Len do
    if S[i] = Delim then Inc(Count);
  SetLength(Result, Count + 1);
  Count := 0;
  k := 1;
  for i := 1 to Len do
  begin
    if S[i] = Delim then
    begin
      Inc(Count);
      SetString(Result[Count-1], PChar(@S[k]), i-k);
      k := i + 1;
    end;
  end; // for i
  Inc(Count);
  SetString(Result[Count-1], PChar(@S[k]), Len-k+1);
end;


Код: Выделить всё

procedure test_explode(const S: string);
var
  arr: TStringArr;
  i, Len: Integer;
begin
  writeln(S);
  arr := explode2('\', S);
  Len := Length(arr);
  for i := 0 to Len-1 do
  begin
    writeln(arr[i]);
  end; // for i
end;
SergKam
постоялец
Сообщения: 251
Зарегистрирован: 16.11.2005 20:31:11
Откуда: Украина,Харьков

Сообщение SergKam »

Такие нужные функции надо добавлять в RTL SysUtils.
Я тоже часто такое пишу, каждый раз вспоминаю как надо.
Предложите ее команде FPC.
а еще загрузка строк из файла и запись строки в файл, а еще
модуль регулярного выражения perl,и тп.
Nesmit
новенький
Сообщения: 17
Зарегистрирован: 20.11.2006 12:35:50

Сообщение Nesmit »

Хорошее дело, добавить строковые функции.
Например, не нашел GradToDeg. А хотелось бы :)

В разумных пределах, чтоб разрабы не отвлекались от доводки самого фрипаскаля. ;)
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Nesmit писал(а):Например, не нашел GradToDeg. А хотелось бы

А что она делает: переводит значения угла из градов, в градусы?, так вроде все просто GradToDeg = 0.90 * Deg
и причем тут строки?
Nesmit
новенький
Сообщения: 17
Зарегистрирован: 20.11.2006 12:35:50

Сообщение Nesmit »

Потому что нет такой функции, хоть и примитивная.
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Nesmit писал(а):Потому что нет такой функции, хоть и примитивная.

Вот потому-то и нет, что примитивная...
Ответить