Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.03;
Скачать: CL | DM;

Вниз

Функция   Найти похожие ветки 

 
Fu   (2006-08-10 19:50) [0]

Какая в делфи есть функция , чтобы строке s1 присвоить текст меежду запятыми от строки s.
код:
s:="blablabla;1234566;blablablabla";
а s1 должно принимать значение 1234566 соответственно


 
Virgo_Style ©   (2006-08-10 19:58) [1]

Programmer(ProgramDescription:String):TProgram;


 
tesseract ©   (2006-08-10 19:58) [2]

Пример, как из строки выдрать подстроку до разделителя, извлечённая подстрока удаляется, писалась на лету :

function Next(var value:String;rasd:char):string;
  begin
if Length(value)=0 then exit;
    if pos(rasd,value)=0 then
     begin
     result:=(value);
     value:="";
     exit;
     end
     else
     result:=copy(value,1,pos(rasd,value)-1);
    delete(value,1,pos(rasd,value));
  end;


 
Fu   (2006-08-10 20:01) [3]

> Programmer(ProgramDescription:String):TProgram;

не работает :(


 
Loginov Dmitry ©   (2006-08-10 20:23) [4]

> не работает :(


А в чем компилируешь?


 
Fu   (2006-08-10 20:27) [5]

в  делфи


 
Loginov Dmitry ©   (2006-08-10 20:40) [6]

Ладно попробуй [2]

Можешь так еще:

with TStringList.Create do
try
 Delimiter := ";";
 DelimitedText := "blablabla;1234566;blablablabla";
 S1 := Strings[1];
finally
 Free;
end;
 ShowMessage(S1);


 
Loginov Dmitry ©   (2006-08-10 20:42) [7]

Не.. Так тоже работать не будет. Так надо:

function Functiya(Stroka: string): string;
var
 S1: string;
begin
 with TStringList.Create do
 try
   Delimiter := ";";
   DelimitedText := Stroka;
   S1 := Strings[1];
 finally
   Free;
 end;
end;


 
Loginov Dmitry ©   (2006-08-10 20:44) [8]

А лучше так:

function Functiya(Stroka: string): string;
begin
Result := "";
with TStringList.Create do
try
  Delimiter := ";";
  DelimitedText := Stroka;
  Result := Strings[1];
finally
  Free;
end;
end;


 
tesseract ©   (2006-08-10 20:45) [9]

> [7] Loginov Dmitry ©   (10.08.06 20:42)


[2] пашет. Проверил.


 
!_SM_!   (2006-08-11 02:49) [10]

> [8] Loginov Dmitry ©   (10.08.06 20:44)

function Functiya(const Stroka: String; const Ch: Char): String;
var N, LenS: Integer;
begin
 Result := "";
 LenS := Length(Stroka);
 for N:= LenS downto 1 do
  if Stroka[N] <> Ch then Result := Stroka[N] + Result;
end;


А так не лучше? Да какая разница, можно кучу вариантов придумать.
Вот вариант короче:

function Functiya(const Stroka: String; const Ch: Char): String;
var N: Integer;
begin
 Result := "";
 for N:= Length(Stroka) downto 1 do
  if Stroka[N] <> Ch then Result := Stroka[N] + Result;
end;


Но так мне кажеться будет медленнее. Выполнять функцию Length много раз... Т.е. в цикле будет каждый раз высчитываться Length(Stroka) и сравниваться с N. Или не так, ошибаюсь....?

Хотя в вопросе автора немного непонятно

> строке s1 присвоить текст меежду запятыми от строки s.
> код:
> s:="blablabla;1234566;blablablabla";
> а s1 должно принимать значение 1234566 соответственно

???????


 
!_SM_!   (2006-08-11 03:00) [11]

> [0] Fu   (10.08.06 19:50)

Up.

> s1 присвоить текст меежду запятыми от строки s

Тут в примере в строке S и запятых то нет...
Ну может пойдет такой вариант: Удалить текст до первого разделителя (каким образом? можно на основе примера [2] tesseract ©) (delete(Stroka, 1, Pos(",", Stroka));- это для первого разделителя) и от последнего до конца строки, а потом уже из того что осталось поудалять разделители любым понравившимся способом... Может это надо автору... т.е. перед первым разделителем и после последнего текст не нужен?
то Fu А что будет если во входной строке (s) будет 1 запятая (разделитель)?


 
Loginov Dmitry ©   (2006-08-11 08:01) [12]

Если уж гнаться за скоростью, тогда вот это:


function Functiya(Text: string; Delim: Char): string;
var
 I, C: Integer;
 Buf1, Buf2: PChar;
begin
 C := -1;
 Result := Text;
 Buf1 := PChar(Text);
 Buf2 := PChar(Result);
 for I := Pos(Delim, Text) to Length(Text) - 1 do
   if Buf1[I] = Delim then
     Break
   else begin
     Inc(C);
     Buf2[C] := Buf1[I];
   end;
 SetLength(Result, C + 1);
end;


 
evvcom ©   (2006-08-11 09:12) [13]

> [10] !_SM_!   (11.08.06 02:49)
> Но так мне кажеться будет медленнее. Выполнять функцию Length
> много раз... Т.е. в цикле будет каждый раз высчитываться
> Length(Stroka) и сравниваться с N. Или не так, ошибаюсь....?

Не так. Ошибаешься... А вот
> Result := Stroka[N] + Result;
может привести к неоднократному перевыделению памяти под новый стринг и обязательно на каждом проходе с чтениями и записями нового Length(Result). Итог: так не пишут.


 
SerJaNT ©   (2006-08-11 09:19) [14]

function explode(sPart, sInput: string): ArrOfStr;
begin
 while Pos(sPart, sInput) <> 0 do  
 begin
   SetLength(Result, Length(Result) + 1);
   Result[Length(Result) - 1] := Copy(sInput, 0,Pos(sPart, sInput) - 1);
   Delete(sInput, 1,Pos(sPart, sInput));
 end;
 SetLength(Result, Length(Result) + 1);
 Result[Length(Result) - 1] := sInput;
end;


Работает!

Пример использования:
type
 ArrOfStr = array of string;
var
 S:ArrOfStr;
 s2:string;
...
S:=explode(";",s);
s2:=S[1]; // то что тебе нужно


 
evvcom ©   (2006-08-11 09:43) [15]

> [14] SerJaNT ©   (11.08.06 09:19)

Нафига 3 раза Pos(sPart, sInput) вызывать? Или проц мощный, пущай работает? Используй локальные переменные.

> Delete(sInput, 1,Pos(sPart, sInput));

Зачем еще и махинации с входными данными совершать? Есть же PosEx. Его и пользуй.

> function explode(sPart, sInput: string):

Во-во. Еще и копию обязательно нужно сделать.

> S:=explode(";",s);
> s2:=S[1]; // то что тебе нужно

А AV словить?


 
tesseract ©   (2006-08-11 09:45) [16]


> SerJaNT ©   (11.08.06 09:19) [14]


а чем тебе моя не понравилась - так-же работает :-)


 
KilkennyCat ©   (2006-08-11 09:53) [17]

Pos and LastDelimiter


 
SerJaNT ©   (2006-08-11 14:59) [18]


> Нафига 3 раза Pos(sPart, sInput) вызывать? Или проц мощный,
>  пущай работает? Используй локальные переменные.

Я думаю это не критично для проца. Ты даже не заметишь 1 pos будет или 5.


> а чем тебе моя не понравилась - так-же работает :-)

А я и не говорю что мне твой вариант не понравился. Мой - тоже способ.


 
evvcom ©   (2006-08-11 15:38) [19]

> Ты даже не заметишь 1 pos будет или 5.

Т.е. на оптимизацию можно забить. Ну винт хоть пожалей.


 
MsGuns ©   (2006-08-11 15:53) [20]

Страшная ветка


 
Bless ©   (2006-08-11 16:48) [21]


> evvcom ©   (11.08.06 09:43) [15]
> > function explode(sPart, sInput: string):
>
> Во-во. Еще и копию обязательно нужно сделать.
>
>


Копию чего?


 
SerJaNT ©   (2006-08-11 16:55) [22]


> Т.е. на оптимизацию можно забить. Ну винт хоть пожалей.


Кстати, а винт тут не причем - мы же ничего не пишем/читаем! Нет, я же конечно за оптимизацию, но я просто сказал что 1 pos что 5. Даже старым компам пофиг будет.


 
evvcom ©   (2006-08-11 17:04) [23]

> [21] Bless ©   (11.08.06 16:48)

Да. Недавно обсуждалось это. Выяснили, что строки копируются по новым адресам при необходимости. В данном коде такая необходимость прослеживается. Потому sInput будет скопирована.


 
evvcom ©   (2006-08-11 17:15) [24]

> Кстати, а винт тут не причем - мы же ничего не пишем/читаем!

Мы читаем с винта exe-файл. C той неоптимальностью, с которой написана функция, она увеличивает размер, ну скажем, процентов на 10-20. Это всего навсего маленькая функция, но написана очень небрежно. Я встречал и более небрежное отношение к коду, как многие сейчас любят говорить, "тупое" копирование тела функции и легкий макияж. В итоге код, написанный таким программистом, увеличивается процентов на 100, а то и более! Вот при том тут и винт.
Все, устал чего-то доказывать. Пиши, как знаешь. Ушел домой.


 
SerJaNT ©   (2006-08-11 17:16) [25]


> Пиши, как знаешь.


Да это не мне надо! Я просто написал как знаю. Все, я тоже домой пошел.


 
Bless ©   (2006-08-11 17:26) [26]


> evvcom ©   (11.08.06 17:04) [23]
>
> > [21] Bless ©   (11.08.06 16:48)
>
> Да. Недавно обсуждалось это. Выяснили, что строки копируются
> по новым адресам при необходимости. В данном коде такая
> необходимость прослеживается. Потому sInput будет скопирована.
>
>


Я все же не понял суть претензии к строчке
> function explode(sPart, sInput: string):
Как ему надо было написать?


 
evvcom ©   (2006-08-11 17:37) [27]

> [26] Bless ©   (11.08.06 17:26)

Еще не ушел домой... :(

> Как ему надо было написать?

function explode(const sPart, sInput: string): ...;


 
SerJaNT ©   (2006-08-12 02:22) [28]


> de(const sPart,


действительно!


 
Bless ©   (2006-08-14 09:00) [29]


> evvcom ©   (11.08.06 17:37) [27]
>
> > Как ему надо было написать?
>
> function explode(const sPart, sInput: string): ...;


Дык, он же Delete(sInput,... делает!


 
evvcom ©   (2006-08-14 09:11) [30]

> [29] Bless ©   (14.08.06 09:00)
> Дык, он же Delete(sInput,... делает!

Дык, он же не нужен! Это я раскритиковал чуть выше замечания про отсутствие const:

> [15] evvcom ©   (11.08.06 09:43)
> > Delete(sInput, 1,Pos(sPart, sInput));
>
> Зачем еще и махинации с входными данными совершать? Есть
> же PosEx. Его и пользуй.


 
Bless ©   (2006-08-14 09:19) [31]


> evvcom ©   (14.08.06 09:11) [30]
>
> > [29] Bless ©   (14.08.06 09:00)
> > Дык, он же Delete(sInput,... делает!
>
> Дык, он же не нужен! Это я раскритиковал чуть выше замечания
> про отсутствие const:
>


Ясно. Я ж не знал, что это было замечание к его примеру, как если бы он уже учел предыдущие замечания :)



Страницы: 1 вся ветка

Текущий архив: 2006.09.03;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.062 c
1-1153379746
Лапыч
2006-07-20 11:15
2006.09.03
Потокозащищенный список строк


15-1154928251
Ega23
2006-08-07 09:24
2006.09.03
С Днём рождения! 6 августа


1-1153808221
Zilog_
2006-07-25 10:17
2006.09.03
Как правильно перевести с С на Делфи?


15-1151658614
TUser
2006-06-30 13:10
2006.09.03
Не наметить ли в Новосибирске ...


15-1155364407
imbalacedees
2006-08-12 10:33
2006.09.03
mail.ru