Как заменить символы в строке другими символами?

#delphi

Вопрос:

Я использую цикл for do и StringReplace… Я вижу проблему, но не знаю, как ее решить. Я хочу заменить всю строку символами, сохраненными в массиве, затем я хочу сохранить ПОЛНУЮ замещенную строку в sLine. Проблема в том, что каждый раз, когда цикл(L) повторяет код, предыдущее замещенное значение в строке sLine отбрасывается, чтобы оно могло хранить новую полузамещенную строку. (Под «полу» я подразумеваю, что на самом деле в строке за один раз заменяется только 1 символ.)

Есть ли какой-либо способ сначала заменить всю строку, сохранив все ее замененные символы, а затем сохранить ее в строке?

 var
  sEncryptInput, sLine : string;
  K, L : integer;
begin
  redOutEncrypt.Clear;

  for K := 0 to redInEncrypt.Lines.Count do
    begin
      sEncryptInput := redInEncrypt.Lines[K];

      for L := 0 to 25 do
        begin
          sLine := StringReplace(UpperCase(sEncryptInput), UpperCase(arrPlainAlph[L]), arrOffset[L], [rfReplaceAll, rfIgnoreCase]);
        end;

      redOutEncrypt.Lines.Add(sLine);
    end;
end;
 

Комментарии:

1. Это не ответ, но я думаю , что так и должно быть for K := 0 to redInEncrypt.Lines.Count -1 , иначе вы прочтете beyone в конце строки.

2. Если вы заменяете только символы , вам не нужно StringReplace() UpperCase() ) для начала: вы можете просто выполнить еще один цикл для проверки его символа (и использования UpCase() ).

Ответ №1:

Проблема в том, что каждая итерация вашего цикла считывается sEncryptInput в качестве источника для последующего вызова StringReplace . Поскольку sEncryptInput не обновляется в течение каждой итерации, вы sLine содержите только изменения, внесенные в последней итерации цикла.

Чтобы сохранить все изменения, внесенные в каждой итерации, ваши циклы должны как считываться, так и записываться в одну и ту же переменную. Поэтому ваш код должен выглядеть так:

       ...
      sEncryptInput := redInEncrypt.Lines[K];

      //Copy unmodified sEncryptInput to sLine before doing any changes in your loop
      sLine = sEncryptInput;

      for L := 0 to 25 do
        begin
          //Pass sLine as input sring to StringReplace in order to retain 
          //changes made in previous loop cycles
          sLine := StringReplace(UpperCase(sLine), UpperCase(arrPlainAlph[L]), arrOffset[L], [rfReplaceAll, rfIgnoreCase]);
        end;
      ...
 

Комментарии:

1. @TomBrunberg Большое спасибо! Действительно, я удалил слишком много. Пропущенная точка с запятой привлекла все мое внимание…

2. Зачем все эти UpperCase утверждения внутри цикла? Так как вы используете rfIgnoreCase , в этом нет необходимости. И если вы хотите, чтобы в конце все было в верхнем регистре, просто введите последнюю строку в верхнем регистре вне цикла.