Ошибка сегментации при реализации программы на C для сортировки - PullRequest
0 голосов
/ 31 октября 2019

Я разрабатываю программу для сортировки файла XML, который содержит открытый словарь. Я пытаюсь сделать это, используя flex для распознавания слов, тегов и т. Д. И связанных списков в C, чтобы отсортировать их. К настоящему времени у меня есть связанный список для сортировки каждого слова в алфавитном порядке, и я попытался сделать то же самое, чтобы отсортировать эти слова внутри использования, которому соответствует каждое слово. У меня проблема с сегментацией, возможно, потому что список получает значение NULL, я думаю, из функции InsertUsageWord(), где я ошибся? Заранее спасибо.

C-код

typedef struct _dicio {
        char *usg, *orth, *def; //uso, palavra e definicao
        struct _dicio *next;
} dicio;

typedef struct _usage {
    char *word;
    struct _usage *unext;
} usage;

usage* InsertUsageWord(usage* ulista, char *palavra) {
    usage *unode = (usage*)malloc(sizeof(usage));
    unode->word = strdup(palavra);
    unode->unext = ulista;
    return unode;
}

dicio* InsertWord(dicio* lista, char *utilizacao, char *ortografia, char *definicao) {
        dicio *node = (dicio*)malloc(sizeof(dicio));
        node->usg = strdup(utilizacao);
        node->orth = strdup(ortografia);
        node->def = strdup(definicao);
        node->next = lista;
        return node;
}

void ListWord(usage* ulista, dicio* lista) {
        if(ulista == NULL) return;
        printf("%s", ulista->word);
    List(lista, ulista->word);
    ListWord(ulista->unext, lista);
}

void List(dicio* lista, char* usg) {
        if(lista == NULL) return;
        if (strcmp(usg, lista->usg) == 0 ) {printf("%s", lista->usg);}
    List(lista->next, usg);
}

Flex-код

        #include "dictp16.c"
        char *word;
        char *palavra;
        char *utilizacao;
        char *definicao;
        dicio *dicionario = NULL;
        usage *use = NULL;

LETRAS [a-zA-ZÁÉÍÓÚÀÌüçÇãáíéóúàâôêõ. -;,()_]+

%x ORT USG DEF
%%
\<orth\>                                { BEGIN(ORT); }
<ORT>{LETRAS}                               { palavra = strdup(yytext); }
<ORT>\<\/orth\>                             { BEGIN(INITIAL); }

\<usg\ type=\"[a-z]+\"\>                        { BEGIN(USG); }
<USG>{LETRAS}                               { utilizacao = strdup(yytext); }
<USG>\<\/usg\>                              { use = InsertUsageWord(use, word);
                                         BEGIN(INITIAL); }

\<def\>                                 { BEGIN(DEF); }
<DEF>{LETRAS}                               { definicao = strdup(yytext); }
<DEF>\n                                 {;}
<DEF>.                                  {;}
<DEF>\<\/def\>                              { dicionario = InsertWord(dicionario, utilizacao, palavra, definicao);  
                                              BEGIN(INITIAL); }
\n                                  {}   
<<EOF>>                                 { ListWord(use, dicionario);  return 0; }
.                                   {;}
%%

Ожидаемый результат будет примерно таким:

ant:
- Alampi~ao: O mesmo que _lampi~ao_. Cf. B. Pereira, _Pros´odia_, vb. _polymixus_.
- An^espera: O mesmo que _n^espera_. Cf. B. Pereira, _Prosodia_, vb. _pytmena_.
- Arraba¸ca: Planta, o mesmo que _raba¸ca_.
...
Pop.
- Achafundar: Enterrar no logo; meter no fundo da ´agua.
- Acarditar: O mesmo que _acreditar_.
- Alampi~ao: O mesmo que _lampi~ao_. Cf. B. Pereira, _Pros´odia_, vb. _polymixus_.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Вы звоните InsertUsageWord(use, word); с word, который не инициализирован. Вы случайно не хотели называть это utilizacao? Как это было только что инициализировано с malloc() до strdup()!

0 голосов
/ 31 октября 2019

Вы звоните

use = InsertUsageWord (use, word);

, но вы никогда не инициализировали слово для чего-либо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...