Как сохранить строки из текстового файла в C без одинаковых ссылок?

У меня есть текстовый файл и способ прочитать слово из текстового файла. Это слово сохраняется в массиве символов, а затем отправляется функции для сохранения в узле дерева. После этого слово сбрасывается, и процесс начинается заново. Однако, когда я проверяю дерево, все узлы ссылаются на одну и ту же строку.

Получить слово:

  node* run(node* root)
   {
       char c;
       int index = 0;
       char word[100];
       fp = fopen("text.txt","rt");
       do
       {
           c = (char)fgetc(fp);
           if(c == ' ' || c == '\n' || c == '\0' || c == '\t' || c == ',' || c == ';' || c == '.' || c == '?' || c == '!' || c == ':')
           {
               root = insert(root, word);
               word[0] = 0;
               index = 0;
           }
           else
           {
               word[index++] = c;
               word[index] = 0;
           }
       }while(c != EOF);

       fclose(fp);
       return root;
   }

Сделайте что-нибудь со словом во вставке:

node* insert(node* N, char* key)
{
    /* 1.  Perform the normal BST rotation */
    if (N == NULL)
        return(newNode(key));
   ...
}

Создайте новый узел из строки:

node* newNode(char* string)
{
    node* newNode = (node*) malloc(sizeof(node));
    newNode->data = string;
    newNode->left = NULL;
    newNode->right = NULL;
    newNode->height = 1;  //Height of a leaf is one
    return(newNode);
}

Однако после того, как я добавил новый узел и сбросил свое слово, значение данных в корне изменилось на то, на что изменилось исходное слово... Я предполагаю, что с указателями происходит что-то странное? По сути, как мне присвоить newNode->data значению строки В ТЕКУЩИЙ МОМЕНТ вместо ее значения на всю вечность.


person user2154420    schedule 21.10.2014    source источник
comment
Кстати: лучше использовать int c; ... c = fgetc(fp); if (c == EOF || c == ' ' || c == '\n' ...). Текущий код отображает EOF в 1 из char.   -  person chux - Reinstate Monica    schedule 22.10.2014


Ответы (2)


Это потому, что вы используете word при создании каждого узла, который просто хранит адрес первого символа из word.

Сдача

newNode->data = string;

to

newNode->data = strdup(string);
person R Sahu    schedule 21.10.2014

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

// Allocation of memory only once
char word[100];

Вам нужно сделать новое распределение, когда вы назначаете строку своим узлам и копируете свою строку. Что-то вроде этого:

char copy[100];
strcopy(copy, word);
insert(root, word);

Надеюсь, это поможет :)

person torpedro    schedule 21.10.2014
comment
Но вместо одного word вы только смещаете проблему к тому, чтобы иметь только один copy. Так что не решение. - person Jongware; 22.10.2014