我正在做一个项目,我必须实现一个指向结构的指针数组!该结构包含一个单词,其翻译和一个指向next的指针!因此,我必须创建一个链接列表,其中头的指针位于数组的一个单元格中!我用NULL值初始化main中的数组!之后,我必须从文件中读取一个单词,然后分配一个结构,在该结构中,我将单词及其翻译也放置在文件中。该文件的结构如下所示:
hello;bonjour
有一个名为hash_string(word)的函数,该函数生成从0到数组大小1的索引。因此,对于单词hello,我得到了索引2。我使用此函数将单词及其翻译插入数组:
void remplissage_hachage (cellule_t **tabMajeur,FILE *fichier)
{
char string1[20];
cellule_t *copy;
unsigned int indice;
int boolean = 0;
char *string2, *string3;
cellule_t *c;
while(fgets(string1,100,fichier) != NULL)
{
string2 = strtok(string1,";");
string3 = strtok(NULL,";");
printf("string2: %s\n",string2);
printf("string3: %s\n",string3);
if(tabMajeur[2] != 0)
{
printf("Adresse 2 : %s\n",tabMajeur[2]->mot);
}
if(boolean != 1 && tabMajeur[2] == 0)
{
copy = tabMajeur[2];
tabMajeur[2] = creationCellule(string2,string3);
tabMajeur[2]->suivant = copy;
}
}
}
插入正确完成,但是例如当我读另一个词时
bye;au revoir
hash_string也给出了索引= 2,现在我必须通过将该值放在链接列表的开头并将hello作为第二个元素来创建链接列表。出现问题的原因是,如果不进行插入,array [2]会给出结果= bye而不是hello,因此它立即覆盖了hello这个词。我不知道怎么可能?
我还将放置结构和主要功能,向大家展示如何初始化数组:
typedef struct cell{
char *mot;
char *traduction;
struct cell *suivant;
}cellule_t;
int main()
{
cellule_t **tabMajeur;
tabMajeur = malloc(HASH_MAX * sizeof(cellule_t *));
memset(tabMajeur,0 ,HASH_MAX);
FILE * file = fopen("fichier.txt","r");
remplissage_hachage(tabMajeur,"fichier.txt");
}
文件如下:
hello;bonjour
bye;au revoir
非常感谢您!我知道这段文字很长,但我想解释所有内容以使其清楚!
答案 0 :(得分:0)
您的代码中有几个问题:
char string1[20]; ... while(fgets(string1,100,fichier) != NULL)
fgets 可以用未定义的字符写出 string1 ,将 string1 的大小调整为100,以放置更多空间,在任何情况下都可以使用 > sizeof :
char string1[100]; ... while(fgets(string1, sizeof(string1),fichier) != NULL)
在主要
remplissage_hachage(tabMajeur,“ fichier.txt”);
必须为
remplissage_hachage(tabMajeur,file);
因为remplissage_hachage
获得FILE*
,而不是文件名
如果我进行了前面的更正并添加了缺失的定义
#define HASH_MAX 10
cellule_t * creationCellule(char * s1, char * s2)
{
cellule_t * r = malloc(sizeof(cellule_t));
r->mot = strdup(s1);
r->traduction = strdup(s2);
r->suivant = NULL;
return r;
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra -Wall c.c
c.c: In function ‘remplissage_hachage’:
c.c:33:12: warning: unused variable ‘c’ [-Wunused-variable]
cellule_t *c;
^
c.c:30:14: warning: unused variable ‘indice’ [-Wunused-variable]
unsigned int indice;
^~~~~~
pi@raspberrypi:/tmp $ ./a.out
string2: hello
string3: bonjour
string2: bye
string3: au revoir
Adresse 2 : hello
pi@raspberrypi:/tmp $
符合预期
该问题的原因在于,在不进行插入的情况下,array [2]给出了结果= bye,而不是hello,因此它立即覆盖了hello这个词。我不知道怎么可能
这意味着您不会重复字符串,而是要做类似的事情:
cellule_t * creationCellule(char * s1, char * s2) { cellule_t * r = malloc(sizeof(cellule_t)); r->mot = s1; r->traduction = s2; r->suivant = NULL; return r; }
所以您总是将指针保存到 tabMajeur 中的 string1 中,因此第二次打印值使用 string1 的新内容。 >
你必须做
r->mot = strdup(s1);
r->traduction = strdup(s2);
,或者如果您没有 strdup
r->mot = malloc(strlen(s1) + 1);
strcpy(r->mot, s1);
r->traduction = malloc(strlen(s2) + 1);
strcpy(r->traduction, s2);