2013-12-08 5 views
0

Я пишу программу для перевода данного слова, следуя пути к переводу. Каждая буква данного слова представляет собой определенный узел.Непрерывный вывод

Вывод должен привести все слова, чтобы переводить с последующим соответствующими переводами, но я получил это как выход в смене:

a: 4��t� xp� t���� 
an: 4��t� xp� t���� 
ant: 4��t� xp� t���� 
at: 4��t� xp� t���� 
atom: 4��t� xp� t���� 
no: 4��s� xp� t���� 
not: 4��s� xp� t���� 
tea: 4��q� xp� t���� 
ten: 4��q� xp� t���� 

main.c:

int main() 
    { 
     struct Trie* trie = trie_alloc(); 
     trie_insert_from_file(trie, "dictionary.txt"); 
     trie_print_mappings(trie); 
     trie_free(trie); 

     return 0; 
    } 

trie.c :

int trie_insert(Trie* trie, const char* key, const char* value) 
    { 
     ... 
    } 

    void trie_insert_from_file(Trie* trie, const char* file_name) 
    { 
     FILE* file = fopen(file_name, "r"); 
     if (file == NULL) 
     { 
      fprintf(stderr, "Unable to open %s for reading: %s\n", 
        file_name, strerror(errno)); 
      return; 
     } 
     while (!feof(file)) 
     { 
      char key[64]; 
      char value[64]; 
      int nb_matched = fscanf(file, "%63[a-z] : %63[a-z]\n", key, value); 

      if (nb_matched == 2) 
      { 
        trie_insert(trie, key, value); 
      } 
      else 
      { 
       fprintf(stderr, "Syntax error while reading file\n"); 
       fclose(file); 
       return; 
      } 
     } 
     fclose(file); 
    } 

    static char* str_append_char(const char* str, char c) 
    { 
     size_t len = strlen(str); 
     char* new_str = malloc(len + 2); 
     strcpy(new_str, str); 
     new_str[len] = c; 
     new_str[len + 1] = '\0'; 
     return new_str; 
    } 

    static void trie_print_mappings_aux(Trie* trie, const char* current_prefix) 
    { 
     if (trie->value != NULL) 
      printf("%s: %s\n", current_prefix, trie->value); 
     int i; 
     for (i = 0; i < TRIE_NB_CHILDREN; i++) 
     { 
      Trie* child = trie->children[i]; 
      if (child != NULL) 
      { 
       char* child_prefix = 
        str_append_char(current_prefix, trie_get_child_char(i)); 
       trie_print_mappings_aux(child, child_prefix); 
       free(child_prefix); 
      } 
     } 
    } 

    void trie_print_mappings(Trie* trie) 
    { 
     trie_print_mappings_aux(trie, ""); 
    } 

trie.h:

#define TRIE_NB_CHILDREN 26 

typedef struct Trie 
{ 
    char* value; 
    struct Trie* children[TRIE_NB_CHILDREN]; 
} Trie; 

Это не произошло, когда я ввожу данные с ручное ее закрытие функции trie_insert без чтения .txt файл с insert_from_file.

Eg. trie_insert(trie, (const char*)&"ten", (const char*)&"tien"); 
    trie_insert(trie, (const char*)&"no", (const char*)&"nee"); 
    trie_insert(trie, (const char*)&"not", (const char*)&"niet"); 
... 

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

Функции insert_from_file, str_append_char, trie_print_mapping_aux * должны работать правильно, так как они были даны мне. Таким образом, ошибка может быть в trie_insert, тот, который я реализовал.

Любая помощь будет высоко оценена.

+2

Ничего себе! Сократите код, пожалуйста. –

+0

Все, кроме кухонной раковины и двух (наиболее вероятно) соответствующих функций 'trie_insert_from_file' и' trie_print_mappings' ... И да, мы * делаем * нужно видеть, как вы их устанавливаете. – usr2564301

+0

Код символа файла ("dictionary.txt") не является ASCII? – BLUEPIXY

ответ

2

Вы устанавливаете trie->value указатель (в trie_insert) в строку хранится в стеке (в trie_insert_from_file - char value[64]).

Переменные, хранящиеся в стеке, «теряются», когда функция возвращает - и это означает, что ваша команда указывает где-то там, где она не должна быть (на одном и том же адресе указателя будут совершенно разные и нерелевантные данные).

Решение скопировать value строку в куче:

if(*key == '\0') 
{ 
    trie->value = (char*)malloc(sizeof(char)*64); 
    strcpy(trie->value, value); 
    return 1; 
} 

Просто убедитесь, чтобы освободить выделенную память, когда она не нужна.

+0

Я проверил его, и вы были правы! Большое спасибо! – Nickelium

+0

Ваш прием :) –

Смежные вопросы