Задать вопрос
@Shaunluu

Как добавить перенос на новую строку?

День добрый. Есть сайт с диапозонами IP. Я беру через idhttp.get. и вставляю в memo1.text. Там получается всё одной строкой.
e487f93d764846cc93d7b4b82b04688a.jpg
Диапозоны ip в формате CIDR - это xxx.xxx.xxx.xxx/xx , реализовал перенос так
const
  sLineBreak = {$IFDEF LINUX} AnsiChar(#10) {$ENDIF}
               {$IFDEF MSWINDOWS} AnsiString(#13#10) {$ENDIF};


    for i := 0 to Length(source) do
    begin
         if source[i] = '/' then Insert(sLineBreak, source, i+3);
    end;

Вроде функция работает, но почему-то ближе к концу все ломается,хотя видно, что формат ip точно такойже как и до этого: 23e2a07e2d654ebd8ccf07e32d4e0f29.jpg
Почему такое может быть ? и как можно сделать по другому, если сталкивались с таким. Благодарю!
  • Вопрос задан
  • 501 просмотр
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
xpert13
@xpert13
Full Stack Developer
Всё очень просто - вы постоянно добавляете новые символы и тем самым увеличиваете длину строки, но цикл крутится до окончания исходной строки. Лучше всего будет сделать обратный цикл:
for i := Length(source) downto 1 do
begin
  if source[i] = '/' then Insert(sLineBreak, source, i+3);
end;


P.S. В делфи, в нулевом индексе String находится размер массива, а сами символы находятся начиная с индекса 1.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Я добавлю к Александр .
В отличие от Си, где условие цикла каждый раз вычисляется полностью, в Паскале вторая граница for вычисляется один раз и запоминается.
Потому длина строки меняется, а мы ходим до самой первой.

К тому же вы неправильно решаете задачу. Никакой там не одной строкой. В ответе сервера концы строк LF, а надо CR+LF. Вот функция (крайне неоптимизированная), которая приводит концы строк к единому виду независимо от того, какие там стоят.
function NormalizeEol(const s : string) : string;
begin
  Result := StringReplace(s, #13#10, #10, [rfReplaceAll]);
  Result := StringReplace(Result, #13, #10, [rfReplaceAll]);
  Result := StringReplace(Result, #10, #13#10, [rfReplaceAll]);
end;
Ответ написан
Комментировать
@Shaunluu Автор вопроса
Большое спасибо, ребят! Действительно, не подумал , об этом - давно что-то не ковырялся в программировании последний раз.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы