实现C程序进行排序时出现分段故障



我正在开发一个程序来对包含开放字典的XML文件进行排序。我尝试使用flex来识别单词、标签等,并使用C中的链表对它们进行排序。到目前为止,我已经有了一个链表,可以按字母顺序对每个单词进行排序,我也试着按照每个单词对应的用法对这些单词进行排序。我遇到了分段问题,可能是因为列表从InsertUsageWord()函数中得到了NULL,我想我哪里出错了?提前谢谢。

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);
}

弹性代码

#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_.

您使用未初始化的word调用InsertUsageWord(use, word);。你想用utilizacao来称呼它吗?因为它刚刚用malloc()strdup()初始化!

您正在调用

use=InsertUsageWord(use,word(;

但您从未将单词初始化为任何

最新更新