Форум: "Начинающим";
Текущий архив: 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