Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.03;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.043 c
2-1155628618
stalcker
2006-08-15 11:56
2006.09.03
idHTTP


6-1145086748
ГостьНомер
2006-04-15 11:39
2006.09.03
indy-компонент tidHttp, ошибка 411 Length Required


15-1154895244
Footballer
2006-08-07 00:14
2006.09.03
Исходники плееров


9-1133771636
@!!ex
2005-12-05 11:33
2006.09.03
OpenGL на ATI и Intel


3-1151495892
Ega23
2006-06-28 15:58
2006.09.03
Как узнать - Identity поле, или нет?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский