Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2013, 16:26   #1
D!zel
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 74
По умолчанию Замена одного символа другим в строке

Привет всем!

Скажите, пожалуйста, как в строке заменить один символ другим?
Допустим, заменить двоеточие на точку.

Пробовал через format(), но я его не понимаю вообще... =\
D!zel вне форума Ответить с цитированием
Старый 15.03.2013, 16:39   #2
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Строка есть массив символов.
Перебираешь символы в цикле по индексу, если символ равен двоеточию, то меняешь его на точку.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 15.03.2013, 16:44   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
  i: Integer;
begin
  s := 'А это что, салат по южному, тогда дайте сосиску: Как-то так:';

  for i := 1 to Length(s) do
  begin
    if s[i] = ':' then s[i] := '.';
  end;

  ShowMessage(s);
end;
Shouldercannon вне форума Ответить с цитированием
Старый 15.03.2013, 16:45   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

StringReplace
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.03.2013, 16:45   #5
D!zel
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 74
По умолчанию

Код:
var
 i: integer;
 s: string;
begin
 s := '000:000:000';
 for i := 1 to length(s) do
  begin
   if s[i] = ':' then s[i] := '.';
  end;

 Form1.Caption := s;
end;
Слишком длинно получается...

Использовал StringReplace.
Спасибо всем. Добавил отзывы

Последний раз редактировалось D!zel; 15.03.2013 в 16:58.
D!zel вне форума Ответить с цитированием
Старый 15.03.2013, 23:23   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Использовал StringReplace.
Угу. Нормально.
Но, если любопытно, то вот что внутри себя представляет StringReplace:

Код:
function StringReplace(const S, OldPattern, NewPattern: string;
  Flags: TReplaceFlags): string;
var
  SearchStr, Patt, NewStr: string;
  Offset: Integer;
begin
  if rfIgnoreCase in Flags then
  begin
    SearchStr := AnsiUpperCase(S);
    Patt := AnsiUpperCase(OldPattern);
  end else
  begin
    SearchStr := S;
    Patt := OldPattern;
  end;
  NewStr := S;
  Result := '';
  while SearchStr <> '' do
  begin
    Offset := AnsiPos(Patt, SearchStr);
    if Offset = 0 then
    begin
      Result := Result + NewStr;
      Break;
    end;
    Result := Result + Copy(NewStr, 1, Offset - 1) + NewPattern;
    NewStr := Copy(NewStr, Offset + Length(OldPattern), MaxInt);
    if not (rfReplaceAll in Flags) then
    begin
      Result := Result + NewStr;
      Break;
    end;
    SearchStr := Copy(SearchStr, Offset + Length(Patt), MaxInt);
  end;
end;
очевидно, что в цикле ищется совпадение с помощью AnsiPos
вот его код:
Код:
function AnsiPos(const Substr, S: string): Integer;
var
  P: PChar;
begin
  Result := 0;
  P := AnsiStrPos(PChar(S), PChar(SubStr));
  if P <> nil then
    Result := Integer(P) - Integer(PChar(S)) + 1;
end;
очевидно, что в ней вызываются функции:
Код:
function StrPos(const Str1, Str2: PChar): PChar; assembler;
asm
        PUSH    EDI
        PUSH    ESI
        PUSH    EBX
        OR      EAX,EAX
        JE      @@2
        OR      EDX,EDX
        JE      @@2
        MOV     EBX,EAX
        MOV     EDI,EDX
        XOR     AL,AL
        MOV     ECX,0FFFFFFFFH
        REPNE   SCASB
        NOT     ECX
        DEC     ECX
        JE      @@2
        MOV     ESI,ECX
        MOV     EDI,EBX
        MOV     ECX,0FFFFFFFFH
        REPNE   SCASB
        NOT     ECX
        SUB     ECX,ESI
        JBE     @@2
        MOV     EDI,EBX
        LEA     EBX,[ESI-1]
@@1:    MOV     ESI,EDX
        LODSB
        REPNE   SCASB
        JNE     @@2
        MOV     EAX,ECX
        PUSH    EDI
        MOV     ECX,EBX
        REPE    CMPSB
        POP     EDI
        MOV     ECX,EAX
        JNE     @@1
        LEA     EAX,[EDI-1]
        JMP     @@3
@@2:    XOR     EAX,EAX
@@3:    POP     EBX
        POP     ESI
        POP     EDI
end;

function AnsiStrPos(Str, SubStr: PChar): PChar;
var
  L1, L2: Cardinal;
  ByteType : TMbcsByteType;
begin
  Result := nil;
  if (Str = nil) or (Str^ = #0) or (SubStr = nil) or (SubStr^ = #0) then Exit;
  L1 := StrLen(Str);
  L2 := StrLen(SubStr);
  Result := StrPos(Str, SubStr);
  while (Result <> nil) and ((L1 - Cardinal(Result - Str)) >= L2) do
  begin
    ByteType := StrByteType(Str, Integer(Result-Str));
{$IFDEF MSWINDOWS}
    if (ByteType <> mbTrailByte) and
      (CompareString(LOCALE_USER_DEFAULT, 0, Result, L2, SubStr, L2) = CSTR_EQUAL) then Exit;
    if (ByteType = mbLeadByte) then Inc(Result);
{$ENDIF}
{$IFDEF LINUX}
    if (ByteType <> mbTrailByte) and
      (strncmp(Result, SubStr, L2) = 0) then Exit;
{$ENDIF}
    Inc(Result);
    Result := StrPos(Result, SubStr);
  end;
  Result := nil;
end;
и т.д. и т.п.

Вы уверены, что это намного проще и быстрее работает, чем
Код:
for i := 1 to length(s) do
   if s[i] = ':' then s[i] := '.';
?????!!




p.s. приведённый выше код взят из папки исходников Delphi 2006 - модуль SysUtils.pas
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.03.2013, 16:56   #7
D!zel
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 74
По умолчанию

Serge_Bliznykov, вы просто растоптали мой разум... :D
Но по "набиранию" кода - StringReplace меньше. Другой вопрос - кто из них более быстродействующий, и какой дает меньшую нагрузку на ЦП и ОЗУ в частности? Вчера также копнул в сторону repeat ... until, и while. И что касается repeat ... until и while, то при тестировании они нагрузили ЦП на 50% (из-за объема текста), и, подозреваю, что если бы они работали в режиме 64-бита, то нагрузили бы ЦП на 100%.
Как быть?
D!zel вне форума Ответить с цитированием
Старый 16.03.2013, 17:25   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от D!zel Посмотреть сообщение
Другой вопрос - кто из них более быстродействующий, и какой дает меньшую нагрузку на ЦП и ОЗУ в частности?
Вы правильно поняли замечание.
Код Shouldercannon будет меньше нагружать и ЦП и ОЗУ.
Цитата:
... при тестировании они нагрузили ЦП на 50% (из-за объема текста), и, подозреваю, что если бы они работали в режиме 64-бита, то нагрузили бы ЦП на 100%.
Как быть?
А вот это в корне неверный вывод. (да и вообще неверный подход к оценке эффективности кода)
Ваша программа нагрузила ЦП на 50% исключительно потому, что у Вас двухъядерный процессор. (и 32 или 64 - не важно)
А любое однопоточное приложение приложение во время своей работы грузит ЦП ровно на 1 поток (если ему не мешают другие приложения), т.е. в Вашем случае - наполовину.

И поэтому вычислительную нагрузку следует оценивать не по процентам, а по времени работы. Т.е. любой код (кроме многопоточного) нагрузит Ваш процессор на 50%, но более эффективный будет нагружать его в течение более короткого времени.
s-andriano вне форума Ответить с цитированием
Старый 16.03.2013, 17:30   #9
D!zel
Пользователь
 
Регистрация: 23.12.2008
Сообщений: 74
По умолчанию

s-andriano, спасибо большое, что все разъяснили.
Добавил отзыв

P.S.
Пойду переписывать код
D!zel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена одного символа на другой W0o0Lf Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 12.12.2012 18:31
Замена символа в строке! Leximus Общие вопросы Delphi 2 12.12.2011 13:13
Замена определенного символа в строке на заданный. vladjke C++ Builder 2 15.06.2011 00:02
ассемблер, замена символа в строке tiger Помощь студентам 3 05.11.2009 15:25
Замена одного элемента строки другим kkkggg PHP 1 18.10.2007 23:09