2015-04-14 9 views
-2

Я пытаюсь понять, как это сделать, но, похоже, не может обернуться вокруг него.Дефрагментация массива в C++

У меня есть массив символов, содержащих несколько строк, включая нуль в конце каждой строки.

Как это:

Example

Я хочу, чтобы иметь возможность объединить все данные и имеют один большой кусок свободного пространства в конце, но мне нужно также сохранить нуль в конце каждой строки.

Как вы это сделаете?

+2

Почему не просто скопировать текстовый вывод здесь? Вам не нужно размещать изображения –

+0

Используйте 'strcat()' или 'strncat()' – Bregalad

+2

Поскольку OP хочет сохранить '\ 0' в конце строки. – doron

ответ

0

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

0

положить каждую строку с «\ 0» в массиве по одному, а затем использовать другой массив для сохранения индекса каждого «\ 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

Вы можете сделать следующее (предполагается, что 0th узел находится в 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; 
}