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

Вниз

Задача о TMemo   Найти похожие ветки 

 
Andrey88+   (2003-01-08 15:47) [0]

Дана строка из неизвестного количества слов.Слова в строке
разделены произвольным кол-вом пробелов. Исключить из строки все
лишние пробелы между словами, кроме одного. Вывести на экран
исходную строку и результат обработки.


 
Delirium^.Tremens ©   (2003-01-08 15:51) [1]

Рекурсивная функция с использованием string handling routines.


 
Alx2 ©   (2003-01-08 16:13) [2]


procedure DelSpaces(var S: string);
var K, L: Integer;
begin
if S = "" then exit;
L := 1;
while (L <= Length(S)) and (S[L] = " ") do inc(L);

if L > Length(S) then
begin
SetLength(S, 0);
exit;
end;

if L > 1 then
S[1] := S[L];
K := L + 1;
L := 1;
for K := K to Length(S) do
if (S[L] <> " ") or (S[K] <> " ") then
begin
inc(L);
S[L] := S[K];
end;
if S[L] <> " " then
SetLength(S, L) else
SetLength(S, L - 1);
end;




 
F1 ©   (2003-01-08 16:20) [3]

Может так

Str1,Str2:String;
LastSpace:Boolean;

Str1:="slova slova slova";
Str2:="";
LastSpace:=False;

LastSpace:=False;
for i:=1 to Length(Str1) do
if LastSpace then
begin
LastSpace:=Str1[i]=" ";
if not LastSpace then Str2:=Str2+Str1[i];
end else
begin
Str2:=Str2+Str1[i];
LastSpace:=Str1[i]=" ";
end;


 
MBo ©   (2003-01-08 16:27) [4]

with TStringList.Create do begin
CommaText:=s;
s:=CommaText;
Free;
end;
s:=StringReplace(s,","," ",[rfReplaceAll]);


 
Sha ©   (2003-01-08 23:04) [5]

procedure OneSpace(var s: string);
var
p: pchar;
i, j: integer;
c: char;
begin;
p:=pointer(s); j:=0; c:=" ";
for i:=0 to Length(s)-1 do if ((p+i)^<>" ") or (c<>" ") then begin;
c:=(p+i)^; (p+j)^:=c; inc(j);
end;
SetLength(s,j-ord((j>0) and (c=" ")));
end;


 
Rooman ©   (2003-01-09 00:17) [6]

С точки зрения эффективности более быстрый будет такой код:

procedure trimctrl(var s: string);
var
c:boolean;
setc:set of char;
p,p9,pt:pchar;
begin
// удаление лишних пробелов и спецсимволов
if length(s)=0 then exit;
UniqueString(s);

c:=false;
setc:=[#0..#32];

p:=pchar(s);
p9:=p+length(s);
pt:=p;
while p<p9 do
if p^ in setc then
inc(p)
else
break;
while p<p9 do
begin
if not c then
if p^ in setc then
begin
pt^:=" ";
inc(pt);
end;
if ord(p^)>32 then
begin
pt^:=p^;
inc(pt);
end;
c:=p^ in setc;
inc(p);
end;
while pt>pchar(s) do
if pt^ in setc then
dec(pt)
else
begin
inc(pt);
break;
end;

pt^:=#0;
setlength(s,pt-pchar(s));
end;


 
MemoryLeak ©   (2003-01-09 00:27) [7]

может не правильно понял вопрос, но просто trim(...) не подходит?


 
MXA   (2003-01-09 02:13) [8]

ёлы-палы, а во так в лоб

for n:=1 to length(AString) do
if (AString[n]<>#32) or (Result[length(Result)]<>#32 then
Result:=Result+AString[n];

не лучше хотя бы в плане
читабельности кода

Кстати никто так и не ответил как это дело
"вывести на экран" :)


 
Separator ©   (2003-01-09 05:46) [9]


> MXA (09.01.03 02:13)
> Кстати никто так и не ответил как это дело
> "вывести на экран" :)

Выводишь результирующу строку в любой TCaption или еще куда и все



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

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

Наверх




Память: 0.49 MB
Время: 0.022 c
6-62689
V_Pavel
2002-11-21 06:00
2003.01.20
Email+PGP


1-62571
Groove_
2003-01-08 19:51
2003.01.20
ЛЮДИ, МАСТЕРА, ПРОГПРАММИСТЫ, HEEEEEEEEEEEEEEEEEELLLLLLLLLLLLPPPP


1-62635
123000
2003-01-09 15:27
2003.01.20
Нарезка файла


1-62535
bAgmAn
2003-01-09 17:52
2003.01.20
Вопрос


6-62687
kalishenko stas
2002-11-13 14:56
2003.01.20
Проблема при ClientSocket1Error