Пытаюсь задать строковой переменной многострочный текст и не выходит. Это вообще возможно? Вроде в турбо-паскале с этим не было проблем. В конце-концов, точка с запятой ведь должна указывать на конец строки, а не перенос строки.
var s:string:=‘123
123
123’;
(Это не видно, но 123 - это строка, за которой следует перенос строки…)
Ругается на первую закавычку, утверждая, что никак не ожидал её там встретить. С однострочным текстом работает без проблем.
Много строчный текст - это всегда одна строка, в которой есть знаки перехода на следующую строку. В разных операционных системах используется знак(и) с разным кодом. В 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'; Много строчный код:
RAlex
Спасибо за пример, но смысл задачи не в том, чтобы три копии сделать, а в том, чтобы забить в переменную длинный текст (сотни, может тысячи строк), скопированный откуда-то ещё, с сохранением всех символов, имеющихся в тексте.
Но в целом я понял - без колдунства не обойтись.
Ну я и говорю - колдунство. То есть, выдумывание способов обойти.
Не то, чтобы это было прям так уж смертельно, просто неудобно, когда пишешь небольшую программку создавать ведро временных файлов. Меня Паскаль с АБС тем и привлёк, что, в отличие от С#, не требует создавать дюжину каталогов и тазик непонятных файлов, чтобы написать “хайло, ворд!”. Но, видно, не всё коту масленица.
Ладно, переживу. Просто не ожидал такого бага от потомка паскаля.
Если вам в переменную надо запихнуть тысячи строк - размещать их в программе и не было бы удобно. А если вам надо строк 10-20 - ставить на каждой строчке +#10+ не сложно. С написанием типа:
begin
var s := 'Текст, текст,
текст, текст, текст,
текст, текст, текст,';
end.
Есть одна большая проблема - всем строчкам кроме первой придётся делать отступ в 0 пробелов от края, что не очень читабельно. Вот вариант который я предложил выше:
begin
var s := 'Текст, текст,'+#10+
'текст, текст, текст,'+#10+
'текст, текст, текст,'+#10;
end.
Обойти чего? У Вас ностальгия по додревним способам программирования? Ассемблера захотелось?
Вам написали, как работать со переносами строк, добавляя константу NewLine или #13#10 - плохо!
Одним оператором занести в переменную текст объемом до 2 Гбайт и сохранить при этом все непечатаемые символы - тоже плохо!
Вы рассказываете о каком-то там “тазике файлов” - я его не вижу. Какой Вы тут “баг” нашли у “потомка паскаля”? Ощущение, что пришли, простите, побрюзжать.
RAlex
"Вам написали… - плохо!" - Успокойтесь, уважаемый! Мне всё хорошо. Ситуацию я понял уже после первого ответа в теме. Просто я не думал, что обязан высказать бурный восторг по этому поводу. Исправляюсь - выражаю бурный восторг. Так лучше?
Гхм, предлагаю решить проблему уровнем выше. На самом деле, очень странно, что тут нет поддержки escape-последовательностей. Как могло бы выглядеть:
var s:= $$'\'hello\r\n\tworld\x20\\';
Writeln(s);
На выходе:
'Hello
world \
Замечу, что в подавляющем большинстве современных языков их поддержка присутствует, причем в абсолютно одинаковом виде - C#, Java, C++, Perl, Python, и т.д. Рассказывать про то, что “в дельфях не было, значит, и тут делать не будем” - как минимум неуместно, т.к. язык уехал от стандарта чуть ли не с момента создания.
Извиняюсь, а причём они тут вообще? escape-sequence - способ вписать в строку непечатаемые символы, а интерполированные строки - инструмент динамической строкогенерации… Разные цели, в общем.
Я посчитал, что автор назвал “изобретением” строку типа $‘123{#10}{#13}’
Нужно ли городить в языке Esc-последовательности - не знаю, мне лично вполне хватает NewLine написать.