![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разбор строки по флагу
Star © (2004-08-07 22:07:00)Дана строка вот такого содержания '254356:23256:5346'. Внимание, вопрос! Как разбить эту строку на три, чтобы каждая начиналась после двоеточия? Т.е.:
254356
23256
5346
Буду очень рад вашей помощи.
diaz (2004-08-08 18:47:00) [21]-> Думкин [18] потому, что все сработано в одном цикле, меньше переменных и меньше времени потрачено на обращение с системным функциям типа inc(), Low(), SetString() и т.д.
DRON (2004-08-08 16:38:00) [22]Ну и ещё один вариант до кучи :) (улучшение [13]):
var
Source:string;
Dest:array[0..2] of string;
PC,First:PChar;
A:Integer;
begin
PC:=PChar(Source);
if Source<>'' then
for A:=Low(Dest)to High(Dest) do begin
First:=PC;
while not(PC^in [':',#0]) do
Inc(PC);
SetString(Dest[A],PC,PC-First);
if PC^=':' then Inc(PC);
end;
end;
Думкин (2004-08-08 09:57:00) [23]> [17] diaz (08.08.04 09:52)
Абсолютно неверное утверждение.
Кстати, домашнее задание - почему [3] оптимальнее?
diaz (2004-08-08 09:52:00) [24]Счетаю, что YurikGL [13] наиволее соответствует поставленной задаче и быстрее.
Думкин (2004-08-08 09:35:00) [25]Безусловно, если только поразумеваютсястроки такого типа. В случаке 3-х конечно городить не надо, а использовать описанное выше.
Fay (2004-08-08 09:33:00) [26]2 Riant (08.08.04 00:42) [10]
Извините меня, пожалуйста! Хуже придумали. См. [13]
Думкин (2004-08-08 09:32:00) [27]> [4] Star (07.08.04 22:56)
В форуме игры тоже один пальцы гнет - все знает, но вот решить нифига не может.
По сабжу.
TStrings, Delimiter.
YurikGL (2004-08-08 09:19:00) [28]var
i,k:longint;
s:string;
m1:array[1..3] of string;
begin
s:=edit1.text;
k:=1;
for i:=1 to length(s) do
if s[i]<>':' then m1[k]:=m1[k]+s[i]
else inc(k);
Fay (2004-08-08 01:12:00) [29]2 Riant (08.08.04 00:42) [10]
Хуже придумать сложно. Это шутка такая? Тут (на форуме) принято ставить смайлики.
Если это не шутка, попробуйте покурить следующий текст :
var
i : Integer;
s : String;
begin
s := '254356:23256:5346';
for i := 1 to Length(s) do
if s[i] = ':' then s[i] := #13;
ShowMessage(s);
end;
wnew (2004-08-08 00:49:00) [30]Ну и в чём разбираться?
s:='254356:23256:5346';
s := StringReplace('254356:23256:5346', ':',#13#10, [rfReplaceAll, rfIgnoreCase]);
Memo1.Lines.Add(s);
Riant (2004-08-08 00:42:00) [31]Нате, разбирайтесь...
var s, c: string;
begin
s:='254356:23256:5346';
repeat
c:=c+copy(s,1,pos(':',s)-1)+#13;
delete(s, 1, pos(':',s));
until s='';
end;
Jolik (2004-08-08 00:22:00) [32]Я делаю так:
program Parser;
var
S : string;
StringList : TStringList;
i : integer;
begin
StringList := TStringList.Create();
// меняем все двоеточия на знак переноса строки
S := StringReplace('254356:23256:5346', ':', ^M, [rfReplaceAll, rfIgnoreCase]);
// заливаем все это в стринглист
StringList.SetText(PChar(S));
// здесь у нас уже три строки в стринглисте
for i := 0 to StringList.Count-1 do
S := StringList[i];
StringList.Free;
end;
Fay (2004-08-07 23:49:00) [33]2 wnew © (07.08.04 23:18) [6]
2 sniknik © (07.08.04 23:25) [7]
Спасибо за поддержку 8).
sniknik (2004-08-07 23:25:00) [34]> тем более не универсальный
универсальность и скорость не идут рука об руку. ;о) обычно. присмотрись внимательнее к примеру Fay © (07.08.04 22:46) [3] если она тебе нужна (скорость). и скажи спасибо за дополнительный вариант, вместо того чтобы огрызатся. кстати полностью отвечаююший на вопрос.
> я всё сразу понял и сделал.
сразу же надо было уведомить всех, а то не дай бог лишних знаний навяжут... и поблагодарить заодно YurikGL-а.
когда так говорят (что всепонял), это означает что понял очень мало на самом деле. чем больше знаеш тем больше осознаеш как это мало...
p.s. свой вариант ебстественно ложить не буду, боюсь на грубость нарватся ;).
wnew (2004-08-07 23:18:00) [35]
> Star (07.08.04 22:56) [4]
Да уж! Звезда, если ты такой крутой, какого ... задаёшь такие детские вопросы, и вместо благодарности палцы разводишь?
Fay (2004-08-07 23:06:00) [36]Я редко отвечаю тем, кто не зарегистрирован на сайте. Видимо недостаточно редко.
>> тем более не универсальный.
ты читал свой вопрос?
>> Мне достаточно было ответа YurikGL ©, я всё сразу понял и сделал.
Как правило, достатточно иметь мозги, а не понты.
Star (2004-08-07 22:56:00) [37]> Fay © (07.08.04 22:46) [3]
И не влом тебе было сочинять веролосипед, тем более не универсальный. Мне достаточно было ответа YurikGL ©, я всё сразу понял и сделал.
Fay (2004-08-07 22:46:00) [38]
procedure YourCoolProc(var s1, s2, s3 : string);
var
n1, n2 : Integer;
begin
n1 := 1;
while (n1 <= Length(s1)) and (s1[n1] <> ':') do Inc(n1);
n2 := n1 + 1;
while (n2 <= Length(s1)) and (s1[n2] <> ':') do Inc(n2);
s3 := Copy(s1, n2 + 1, Length(s1) - n2);
s2 := Copy(s1, n1 + 1, n2 - n1 - 1);
SetLength(s1, n1 - 1);
end;
procedure TForm1.Button1Click(Sender : TObject);
var
s1, s2, s3 : string;
begin
s1 := '254356:23256:5346';
YourCoolProc(s1, s2, s3);
ShowMessage('1) ' + s1 + #13#10'2) ' + s2 + #13#10'3) ' + s3);
end;
YurikGL (2004-08-07 22:12:00) [39]А еще можно в цикле посимвольно перебирать используя счетчик символов ":"
YurikGL (2004-08-07 22:11:00) [40]pos+f1
copy+f1
delete+f1
1) Ищем первое : если его нет то выход
2) Вытаскиваем строку перед ним
3) Удаляем подстроку до первого : и его тоже
4) Идти к п 1.