Многострочный текст


#1

Пытаюсь задать строковой переменной многострочный текст и не выходит. Это вообще возможно? Вроде в турбо-паскале с этим не было проблем. В конце-концов, точка с запятой ведь должна указывать на конец строки, а не перенос строки.

var s:string:=‘123 123 123’; (Это не видно, но 123 - это строка, за которой следует перенос строки…)

Ругается на первую закавычку, утверждая, что никак не ожидал её там встретить. С однострочным текстом работает без проблем.


#2

Много строчный текст - это всегда одна строка, в которой есть знаки перехода на следующую строку. В разных операционных системах используется знак(и) с разным кодом. В Windows это #10, так же если набирать текст от руки - обычно перед #10 ставит невидимый знак #13 (соответствующий по номеру клавише Enter).

Что касается вашего вопроса - есть несколько способов:

  var s :=
    '123'+#10+
    '123'+#10+
    '123'
  var s :=
    '123'+char(10)+
    '123'+char(10)+
    '123'
  var s := $'123{#10}123{#10}123';

И скорее всего много других… Но как в С++ внутри строки писать '123\n123\n123' нету способа.

Кстати, чтоб добавлять код используйте знак ` (он находится за ё, в англ раскладке):

Одно строчный код: `$‘123{#10}123{#10}123’`; Много строчный код:

```

begin

writeln;

end.

```

Будет выглядеть как:

Одно строчный код: $'123{#10}123{#10}123'; Много строчный код:

begin
  writeln;
end.

#3
begin
  var s:=3*('123'+NewLine);
  Writeln(s)
end.

“Трубопаскакали” отдыхают…


#4

RAlex Спасибо за пример, но смысл задачи не в том, чтобы три копии сделать, а в том, чтобы забить в переменную длинный текст (сотни, может тысячи строк), скопированный откуда-то ещё, с сохранением всех символов, имеющихся в тексте. Но в целом я понял - без колдунства не обойтись.


#5

Мой бог, что за проблемы?

begin
  var MyText:=ReadAllText('D:\Proba\MyFile.txt');
  MyText.Println
end.

Я же не зря выше писал: “Трубопаскакали” отдыхают…”


#6

Ну я и говорю - колдунство. То есть, выдумывание способов обойти. Не то, чтобы это было прям так уж смертельно, просто неудобно, когда пишешь небольшую программку создавать ведро временных файлов. Меня Паскаль с АБС тем и привлёк, что, в отличие от С#, не требует создавать дюжину каталогов и тазик непонятных файлов, чтобы написать “хайло, ворд!”. Но, видно, не всё коту масленица. Ладно, переживу. Просто не ожидал такого бага от потомка паскаля.


#7

В делфи никогда не было многострочных констант. Так что бага здесь нету.


#8

Если вам в переменную надо запихнуть тысячи строк - размещать их в программе и не было бы удобно. А если вам надо строк 10-20 - ставить на каждой строчке +#10+ не сложно. С написанием типа:

begin
  var s := 'Текст, текст,
текст, текст, текст,
текст, текст, текст,';
end.

Есть одна большая проблема - всем строчкам кроме первой придётся делать отступ в 0 пробелов от края, что не очень читабельно. Вот вариант который я предложил выше:

begin
  var s := 'Текст, текст,'+#10+
           'текст, текст, текст,'+#10+
           'текст, текст, текст,'+#10;
end.

#9

Обойти чего? У Вас ностальгия по додревним способам программирования? Ассемблера захотелось?

Вам написали, как работать со переносами строк, добавляя константу NewLine или #13#10 - плохо!

Одним оператором занести в переменную текст объемом до 2 Гбайт и сохранить при этом все непечатаемые символы - тоже плохо!

Вы рассказываете о каком-то там “тазике файлов” - я его не вижу. Какой Вы тут “баг” нашли у “потомка паскаля”? Ощущение, что пришли, простите, побрюзжать.


#10

Sun_Serega Удобство - вещь субъективная.

RAlex "Вам написали… - плохо!" - Успокойтесь, уважаемый! Мне всё хорошо. Ситуацию я понял уже после первого ответа в теме. Просто я не думал, что обязан высказать бурный восторг по этому поводу. Исправляюсь - выражаю бурный восторг. Так лучше?


#11

Гхм, предлагаю решить проблему уровнем выше. На самом деле, очень странно, что тут нет поддержки escape-последовательностей. Как могло бы выглядеть:

var s:= $$'\'hello\r\n\tworld\x20\\';
Writeln(s);

На выходе:

'Hello
	world \

Замечу, что в подавляющем большинстве современных языков их поддержка присутствует, причем в абсолютно одинаковом виде - C#, Java, C++, Perl, Python, и т.д. Рассказывать про то, что “в дельфях не было, значит, и тут делать не будем” - как минимум неуместно, т.к. язык уехал от стандарта чуть ли не с момента создания.


#12

Для того, чтобы не мешать существующему коду, туда и засунуты эти два знака доллара. Можно один оставить, если так проще.

Всякие синтаксисы вроде $‘123{#10}{#13}’ - вроде сойдет, но зачем сочинять свой велосипед, когда весь мир пользуется другим видом записи?


#13

Про интерполированные строки в С# Вы, видимо, не слышали. Либо Ваше понятие “весь мир” язык C# не включает.


#14

от какого стандарта?


#15

От того самого, которому на 100% не удовлетворяет ни один паскалевский компилятор. Уж хотя бы потому, что в нем не определены строки - только char.


#16

Извиняюсь, а причём они тут вообще?:smiley: escape-sequence - способ вписать в строку непечатаемые символы, а интерполированные строки - инструмент динамической строкогенерации… Разные цели, в общем.


#17

Я посчитал, что автор назвал “изобретением” строку типа $‘123{#10}{#13}’ Нужно ли городить в языке Esc-последовательности - не знаю, мне лично вполне хватает NewLine написать.