fscanf как-то меняет узел (в с) - PullRequest
1 голос
/ 21 февраля 2012

Я новичок в c и застрял на этой ошибке в течение нескольких часов.Мой код читает каждое слово из текстового файла, а затем сохраняет слово в узле в дереве.

Я сузил задачу до области, отмеченной звездочками: в этот момент я успешно добавил первоеслово в три и проверьте, что правильное значение узла соответствует слову.Затем я использую fscanf, чтобы сохранить следующее слово в файле как символ «добавить».Затем, печатая то же самое, что и раньше, слово узла должно было остаться прежним.Однако оно каким-то образом было изменено на новое слово, которое только что было прочитано из файла.

Как это вообще возможно ??

int main(int argc, char** argv) {

trie_t* trie = malloc(sizeof(trie_t));
trie_init(trie);

int ret;
char* add = malloc(128);
FILE* file = fopen(argv[5], "r");
if (file == NULL) {
    /* Failed to open the file for reading */
    return 0;
}

while (1) {*********************
    if (trie->head->children != NULL) {
        printf("%s\n", trie->head->children->word);
    }
    ret = fscanf(file, "%s", add);
    //printf("word = %s\n",toAdd);
    if (trie->head->children != NULL) {
        printf("%s\n", trie->head->children->word);
    }****************************
    if (ret == EOF) {
        /* End of file */
        ret = 1;
        break;
    } else if (ret <= 0) {
        printf("fails");
        /* Failed to read a word from the file */
        break;
    } else {
        printf("gets here\n");
        /* Succesfully read a word */
        int x = trie_add(trie, add);
        printf("%d\n",x);
    }
}

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Вы назначаете память только один раз для add в:

char* add = malloc(128);

Вам необходимо назначить память для каждого слова, то есть вам нужно переместить malloc в цикл чтения.

Что делает код после публикации: выделите 128 байтов один раз, а затем перезаписывайте это пространство памяти снова и снова каждый раз, когда вы scanf().

Кроме того, на char* add = malloc(128); выследует назначить его как char* add = malloc(128 * sizeof(char)); только для ясности и переносимости:)

1 голос
/ 21 февраля 2012

Я полагаю, вы храните указатель add в trie_t в trie_add функции. В этом случае, поскольку вы повторно используете ту же ячейку памяти add для чтения следующей строки, содержимое указателя, на которое указывает add, изменяется. Поскольку вы просто храните этот указатель в trie, содержимое этого узла также изменяется из-за этого. Чтобы решить эту проблему, вам нужно снова выделить память, используя malloc непосредственно перед тем, как новая строка будет считана из файла, используя fscanf.

...