#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
, в этом нет необходимости. И если вы хотите, чтобы в конце все было в верхнем регистре, просто введите последнюю строку в верхнем регистре вне цикла.