Я пытаюсь понять, как это сделать, но не могу обернуться вокруг этого.
У меня есть массив символов, содержащих несколько строк, включая ноль в конце каждой строки.
Как это:
Я хочу иметь возможность консолидировать все данные и иметь один большой кусок свободного места в конце, но мне нужно также сохранить ноль в конце каждой строки.
Как бы вы это сделали?
Ничто не мешает вам копировать все строки, включая нулевой символ, одну за другой. Вы можете завершить всю последовательность двойным нулем.
Единственная проблема заключается в том, что вы вынуждены последовательно обращаться ко всем строкам. Если это проблема, вы можете использовать начало пространства памяти для создания массива указателей на начало всей вашей строки. Все зависит от того, что вы хотите сделать.
поместите каждую строку с ‘\ 0’ в массив один за другим, затем используйте другой массив для сохранения индекса каждого ‘\ 0’
Я предполагаю, что у вас есть какой-то список, указывающий, где каждая строка начинается и заканчивается:
struct Node {
int startOffset;
int size; // includes trailing zero;
// (not really needed: can search for it with strlength)
};
И вы хотите написать функцию, которая, учитывая vector<Node>
вышеупомянутого и массив символов со строками (давайте назовем его chars
), перемешивает строки так, что для i-го узла nodes[i].startOffset + nodes[i].size == nodes[i+1].startOffset
Вы можете сделать следующее (предполагается, что 0-й узел находится в startOffset
0, и что вектор узла упорядочен по startOffset
):
Node prev = nodes[0];
for (int i = 1; i<nodes.length(); i++) {
Node n = nodes[i];
int targetOffset = prev.startOffset + prev.size;
memmove(chars + targetOffset, chars + n.startOffset, n.size);
n.startOffset = targetOffset;
prev = n;
}