![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Задача о TMemo [D5, WinME]
Andrey88+ © (2003-01-08 15:47:00)Дана строка из неизвестного количества слов.Слова в строке
разделены произвольным кол-вом пробелов. Исключить из строки все
лишние пробелы между словами, кроме одного. Вывести на экран
исходную строку и результат обработки.
Separator (2003-01-09 05:46:00) [1]
> MXA (09.01.03 02:13)
> Кстати никто так и не ответил как это дело
> "вывести на экран" :)
Выводишь результирующу строку в любой TCaption или еще куда и все
MXA (2003-01-09 02:13:00) [2]ёлы-палы, а во так в лоб
for n:=1 to length(AString) do
if (AString[n]<>#32) or (Result[length(Result)]<>#32 then
Result:=Result+AString[n];
не лучше хотя бы в плане
читабельности кода
Кстати никто так и не ответил как это дело
"вывести на экран" :)
MemoryLeak (2003-01-09 00:27:00) [3]может не правильно понял вопрос, но просто trim(...) не подходит?
Rooman (2003-01-09 00:17:00) [4]С точки зрения эффективности более быстрый будет такой код:
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;
Sha (2003-01-08 23:04:00) [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;
MBo (2003-01-08 16:27:00) [6]with TStringList.Create do begin
CommaText:=s;
s:=CommaText;
Free;
end;
s:=StringReplace(s,","," ",[rfReplaceAll]);
F1 (2003-01-08 16:20:00) [7]Может так
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;
Alx2 (2003-01-08 16:13:00) [8]
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;
Delirium^.Tremens (2003-01-08 15:51:00) [9]Рекурсивная функция с использованием string handling routines.