Вниз
Скачать: CL | DM;

Удаление пробела из строки   Найти похожие ветки 

 
smolin   (2004-02-18 14:21) [0]

Подскажите пожалуста какой функцией надо воспользоваться чтобы удалить пробелы из строки.
Например есть строка "aaa bbb ccc", а надо получить "aaabbbccc"


 
MBo ©   (2004-02-18 14:24) [1]

одной строчкой, но медленно - StringReplace

четыре-пять строчек - цикл for со сдвигом очередного символа на количество найденных пробелов.


 
Amoeba ©   (2004-02-18 14:30) [2]

Можно использовать готовую оптимизированную ф-ию из бесплатной отечественной библиотеки QStrings

{ Q_DeleteText удаляет из строки S все вхождения подстроки SubStrToDel. Поиск
подстроки ведется без учета регистра символов. Функция возвращает количество
найденных (и удаленных) фрагментов. }

function Q_DeleteText(var S: string; const SubStrToDel: string): Integer;


 
ALEIIIKA ©   (2004-02-18 14:36) [3]

Удаляет все пробелы в строке S

while Pos(s," ") > 0 do
Delete(s,Pos(s," "),1);


 
Radionov Alexey ©   (2004-02-18 14:54) [4]

>MBo © (18.02.04 14:24)
де жа вю [3]? :))


 
Loneron ©   (2004-02-18 15:01) [5]

Поддерживаю ALEIIIKA © (18.02.04 14:36)
Только незачем Pos 2 раза вызывать


 
Radionov Alexey ©   (2004-02-18 15:07) [6]

>Loneron © (18.02.04 15:01) [5]
Позвольте узнать почему поддерживаете?


 
Loneron ©   (2004-02-18 15:11) [7]

>Radionov Alexey © (18.02.04 15:07)
поддерживаю, потому что сам бы написал этом духе. Позвольте узнать, а вам чем не нравится?


 
Radionov Alexey ©   (2004-02-18 15:17) [8]

>Loneron © (18.02.04 15:11) [7]
Просто потому, что время работы при такой реализации будет пропорционально квадрату длины строки.

(Pos каждый раз начинает просмотр с начала строки - получаем неявный вложенный цикл, когда достаточно одного всего цикла)


 
Loneron ©   (2004-02-18 15:23) [9]

for i := Length(S) - 1 downto 0 do
if S[i] = " " then Delete(S, i, 1);

на этом закончим? :)


 
Radionov Alexey ©   (2004-02-18 15:24) [10]

>Loneron © (18.02.04 15:23) [9]
Не-а :)))
Все равно есть квадратичная зависимость (Delete вызывает ее)
;-)


 
Loneron ©   (2004-02-18 15:29) [11]

Ладно, уговорил
Buf := "";
for i := 0 to Length(S) - 1 do
if S[i] <> " " then Buf := Buf + S[i];
S := Buf;

ну так то хоть пойдет? :)


 
Radionov Alexey ©   (2004-02-18 15:34) [12]

>Loneron © (18.02.04 15:29) [11]
Конкатенация строк - думаешь, легче будет?

Я в таких случаях завожу два индекса (вернее, две индексных переменных) для одной строки. Один для чтения, другой для записи. Первый за каждый шаг увеличивается на 1. Второй увеличивается, если только попадается "правильный" символ. Таким образом все творится пределах одной строки и за один проход. В конце только нужно подкорректировать длину строки по второму индексу.


 
ALEIIIKA ©   (2004-02-18 15:35) [13]

Главно довести идею, оптимизация потом пойдет исходя из найденного текущего решения. Я и не говорил, что это оптимальный вариант.


 
Loneron ©   (2004-02-18 15:46) [14]

>Radionov Alexey © (18.02.04 15:34)
Вах, шайтан! :))


 
Fay ©   (2004-02-18 15:54) [15]

2Loneron © (18.02.04 15:46) [14]
попробуйте проделать это со строкой длиной 100000.


 
Amoeba ©   (2004-02-18 15:57) [16]


> со строкой длиной 100000

Не дай Бог, чтобы такая строка ночью приснилась...


 
Romkin ©   (2004-02-18 16:06) [17]

Так пойдет?

function DeleteAllChars(const S: string; CharToDelete: char): string;
var
i, len: integer;
begin
SetLength(Result, length(S));
len := 0;
for i := 1 to length(S) do
if S[i] <> CharToDelete then
begin
inc(len);
Result[len] := S[i];
end;
SetLength(Result, len);
end;


 
dr Tr0jan ©   (2004-02-19 10:16) [18]

Смотри http://delphimaster.net/view/1-1077158471/



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

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.01 c
9-5934
CHiF
2003-08-06 13:36
2004.03.03
Проект Squad


14-6209
Vinter
2004-02-11 15:33
2004.03.03
Инсталятор


1-6113
HMT
2004-02-21 19:52
2004.03.03
Как присвоить значение сразу нескольким переменным? (обьектам ?)


14-6206
Serginio666
2004-02-11 16:11
2004.03.03
Очень хочется Delphi 8


14-6196
Undert
2004-02-11 15:42
2004.03.03
History в ICQ




   Наверх