Неожиданные символы в начале массива символов - PullRequest
0 голосов
/ 26 января 2020

Я пытался записать порядок обхода дерева в файл .txt в C. Вместо использования массивов я использую свой собственный тип данных vector для хранения значений узлов дерева. Затем я пытаюсь создать массив символов из элементов вектора. Этот процесс идет, как и ожидалось, однако, когда я печатаю массив символов на экране, он печатает 5 случайных символов в начале. Я уверен, что проблема не в векторе , а в другом месте, потому что, когда я пытаюсь напечатать символы внутри l oop, он не выводит неожиданные символы на экран (пожалуйста, см. изображение ниже). Помощь в обнаружении ошибки будет высоко оценена.

NODE* char_tree = optimised_tree(); // First Node of the tree
vector* tree_items = new_vector();
parse_tree(char_tree, tree_items); // parses the tree and add nodes to vector

int len = vec_size(tree_items); // size of the vector
char xs[len + 2];
char x[2];

for (int i = 0; i < len; ++i)
{
    int o = vec_get(tree_items, i); // item at index i in vector tree_items
    printf("%c ", o);
    x[0] = (char)o;
    x[1] = '\0';
    strcat(xs, x);
}

xs[len] = '\n';
xs[len + 1] = '\0';
printf("\n-> %sSIZE %lu\n", xs, sizeof(xs));

output

1 Ответ

1 голос
/ 26 января 2020

Проблема в том, что вы используете переменную xs без ее инициализации! Код:

char xs[len + 2];

объявляет массив символов, но не присваивает ему ничего. Итак, у вас есть массив символов с произвольным (= 'random') содержимым.

Чтобы решить вашу проблему, просто инициализируйте xs пустой строкой, либо когда вы ее объявите (см. Примечание ниже), либо (лучше, ИМХО) с кодом, подобным следующему, до начала for l oop:

strcpy(xs, "");

Примечание: вы не можете использовать обычный синтаксис инициализатора при массивы переменной длины ! Таким образом, такой код не будет работать:

char xs[len + 2] = ""; // Cannot initialize VLA

, но вы могли бы сделать это:

char xs[len + 2]; xs[0] = 0;
...