Есть 5 6 NINE (или 63 *, в зависимости от того, как вы рассчитываете) разные способы записи многострочных строк в YAML.
>
, |
) Они позволяют использовать символы, такие как \
и "
без экранирования, и добавить новую строку (\n
) в конец строки
>
Сложенный стиль удаляет одиночные строки новой строки внутри строки (но добавляет один в конец и преобразует двойные строки в синглы):
Key: >
this is my very very very
long string
→ this is my very very very long string\n
|
Литеральный стиль превращает каждую новую строку внутри строки в литеральную новую строку, и добавляет один в конец:
Key: |
this is my very very very
long string
→ this is my very very very\nlong string\n
Вот официальное определение из YAML Spec 1.2
Скалярное содержимое может быть записано в блок-нотации, используя литеральный стиль (обозначается символом «|»), где все разрывы строк значительны. В качестве альтернативы, они могут быть записаны со сложенным стилем (обозначается символом «>»), где каждый разрыв строки складывается в пространство, если только он не заканчивается пустой или более с отступом.
Блок
>-
,|+
)Вы можете управлять обработкой последней новой строки в строке и любыми простыми пустыми строками (
\n\n
), добавив символ индикатора блокировки блока :
>
,|
: «clip»: сохранить линию, удалить завершающие пустые строки .>-
,|-
: «strip»: удалить линию, удалить завершающие пустые строки.>+
,|+
: «сохранить»:Скалярные стили «Поток» (
,
"
,'
)Они имеют ограниченное экранирование , и постройте однострочную строку без новых символов строки.
простой стиль (без экранирования, нет
#
или:
, ограничения на первый символ):Key: this is my very very very long string
стиль с двойными кавычками (
\
и"
должен быть экранирован\
, строки новой строки могут быть вставлены с буквальной последовательностью\n
, строки могут быть объединены без пробелов с конечным\
):Key: "this is my very very \"very\" loooo\ ng string.\n\nLove, YAML."
& rarr;
"this is my very very \"very\" loooong string.\n\nLove, YAML."
стиль с одним кадром (буквальный
'
должен быть удвоен, никаких специальных символов, возможно полезно для выражения строк, начинающихся с двойных кавычек ):Key: 'this is my very very "very" long string, isn''t it.'
& rarr;
"this is my very very \"very\" long string, isn't it."
Резюме
В этой таблице
_
означаетspace character
.\n
означает «символ новой строки» (\n
в JavaScript), за исключением строки «строки строки», где это означает буквально обратную косую черту и n).> | " ' >- >+ |- |+ -------------------------|------|-----|-----|-----|------|------|------|------ Trailing spaces | Kept | Kept | | | | Kept | Kept | Kept | Kept Single newline => | _ | \n | _ | _ | _ | _ | _ | \n | \n Double newline => | \n | \n\n | \n | \n | \n | \n | \n | \n\n | \n\n Final newline => | \n | \n | | | | | \n | | \n Final dbl nl's => | | | | | | | Kept | | Kept In-line newlines | No | No | No | \n | No | No | No | No | No Spaceless newlines| No | No | No | \ | No | No | No | No | No Single quote | ' | ' | ' | ' | '' | ' | ' | ' | ' Double quote | " | " | " | \" | " | " | " | " | " Backslash | \ | \ | \ | \\ | \ | \ | \ | \ | \ " #", ": " | Ok | Ok | No | Ok | Ok | Ok | Ok | Ok | Ok Can start on same | No | No | Yes | Yes | Yes | No | No | No | No line as key |
Примеры
Обратите внимание на конечные пробелы в строке перед «пробелами».
- > very "long" 'string' with paragraph gap, \n and spaces. - | very "long" 'string' with paragraph gap, \n and spaces. - very "long" 'string' with paragraph gap, \n and spaces. - "very \"long\" 'string' with paragraph gap, \n and s\ p\ a\ c\ e\ s." - 'very "long" ''string'' with paragraph gap, \n and spaces.' - >- very "long" 'string' with paragraph gap, \n and spaces. [ "very \"long\" 'string' with\nparagraph gap, \\n and spaces.\n", "very \"long\"\n'string' with\n\nparagraph gap, \\n and \nspaces.\n", "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", "very \"long\" 'string' with\nparagraph gap, \n and spaces.", "very \"long\" 'string' with\nparagraph gap, \\n and spaces.", "very \"long\" 'string' with\nparagraph gap, \\n and spaces." ]
Стили блоков с индикаторами отступа
На всякий случай выше для вас недостаточно, вы можете добавить «индикатор отступа блока » (после индикатора блокировки блока, если он у вас есть):
- >8 My long string starts over here - |+1 This one starts here
Добавление
Если вы вставляете лишние пробелы в начале не-первых строк в стиле Folded, они будут сохранены с бонусной новой линией. Это не происходит с стилями потока:
- > my long string - my long string
→
["my long\n string\n", "my long string"]
Я даже не могу.
*
2 (или нет) и с 9 возможными индикаторами отступов (или none), 1 простой стиль и 2 кавычки: 2 x (2 + 1) x (9 + 1) + 1 + 2 = 63Часть этой информации также была обобщена здесь .
char Buffer[MAX_BUF];
Buffer
представлен массив размера MAX_BUF
. Техника выделения называется VLA . const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);
Buffer
указатель , которому выделена память размера MAX_BUF
, которая является 1000
. и массив не совпадает с указателем, а C-FAQ имеет очень хорошую коллекцию, в которой подробно описаны причины .
Основное различие в терминах удобство и поведение:
malloc()
d памяти должны быть free()
d. [Courtesy: Giorgi ] Примечание: Wiki
Например, Компилятор GNU C выделяет память для VLA в стеке.
blockquote>
char* Buffer = malloc(MAX_BUF);
создает указатель char
Buffer
, динамически выделяет MAX_BUF
байты памяти через malloc
и делает Buffer
точкой для начала выделенного пространства. Эта память выделяется в куче.
char Buffer[MAX_BUF];
создает массив Buffer
размера MAX_BUF
, который может содержать максимум символов MAX_BUF
. Обратите внимание, что вы создаете массив переменной длины (функция, введенная в C99 ), поскольку MAX_BUF
является переменной. Этот массив может быть создан в стеке.
MAX_BUF
не является константой времени компиляции.
– Jonathan Leffler
3 July 2015 в 06:20
Я добавлю немного информации с точки зрения управления памятью, в дополнение к тому, что говорили другие.
1) Основное различие здесь:
const int MAX_BUF = 1000;
char* Buffer = malloc(MAX_BUF);
Вам нужно управлять выделенной памятью вручную, например, free Buffer
, когда вы закончите с ней.
2) Во втором случае:
char Buffer[MAX_BUF];
Вам ничего не нужно, чтобы освободить его (или освободить его дважды). Он будет автоматически уничтожен. Следовательно, вы избегаете задачи обработки памяти - это хорошо. Вы должны стараться всегда оценивать, какой подход вам нужен.
Некоторые точки.
free()
, который и я, и @coolguy пропустили. :-)
– Sourav Ghosh
3 July 2015 в 06:42
Наиболее заметным отличием является область. Массив VLA будет действителен только внутри области, где он объявлен, тогда как динамический массив будет доступен везде в программе до тех пор, пока вы не назовете free()
.
На практике VLA может быть быстрее, чем динамическая память , если компилятор использует распределение стека для VLA. Однако он не указывается стандартом C, где выделен VLA.
(Компилятор мог теоретически распределить VLA в куче, но тогда компилятор также будет отвечать за очистку. Я не думаю, что такие решения существуют. Каждый компилятор, который я использовал всегда объявлять VLA в стеке.)
Это означает, что VLA не подходят для хранения больших объемов данных: вы рискуете переполнением стека. Однако это не проблема, когда вы используете динамическую память.
VLAs не имеют такой же переносимости, как и динамические массивы, поскольку ужасно старые компиляторы не поддерживают VLA. Теоретически, новым компиляторам C11 также не нужно поддерживать VLA, хотя на данный момент я знаю, что никакой компилятор не был настолько глуп, чтобы отказаться от этой поддержки.
Сравнение / сводка: