自动分配给指针数组的值

时间:2019-06-06 15:26:30

标签: c arrays pointers

我正在做一个项目,我必须实现一个指向结构的指针数组!该结构包含一个单词,其翻译和一个指向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

非常感谢您!我知道这段文字很长,但我想解释所有内容以使其清楚!

1 个答案:

答案 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);