-3

ファイルを読み込んで、ハッシュに保存してからコピーしようとしています。ただし、互換性のないポインター型を取得します

struct hash_struct {
    int id;                   
    char name[BUFFER_SIZE];            /* key (string WITHIN the structure */
    UT_hash_handle hh;         /* makes this structure hashable */
};

int main(int argc, char *argv[] )
{
    char *lines[80];
    FILE* fp = fopen("file.txt","r");
    if(fgets(*lines, BUFFER_SIZE, fp) != NULL)
    {
        puts(*lines);
        // do something
    }
    fclose(fp);
    const char **n;
    char *names[1024];
    strcpy(*names, *lines);
    struct hash_struct *s, *tmp, *users = NULL;
    int i=0;
for (n = names; *n != NULL; n++) 
{
    s = (struct hash_struct*)malloc(sizeof(struct hash_struct));
    strncpy(s->name, *n,10);
    s->id = i++;
    HASH_ADD_STR( users, name, s );
}

HASH_FIND_STR( users, "joe", s);
if (s) printf("joe's id is %d\n", s->id);
printf("Hash has %d entries\n",HASH_COUNT(users));

/* free the hash table contents */
HASH_ITER(hh, users, s, tmp) {
  HASH_DEL(users, s);
  free(s);
}
return 0;

}

初期化const char **n, *names = {array elements here}; するとコードは機能しますが、私が持っているコードでは機能しません。助けてください。

4

1 に答える 1

0

linesポインターの配列として宣言されていますが、charポインターが指す文字列にスペースを割り当てていません。作業中のバージョンでは、コンパイラが各文字列にスペースを割り当てていました。

strcpyさらに、 80 個のポインターの配列を 1024 個のポインターの配列にコピーするために使用することはできません。代わりに、読み込む各行には、読み込むためのスペースを割り当てる必要があります。次に、それらのそれぞれのアドレスを の要素に割り当てることができますnames。実際、@BLUEPIXY が示唆するように、80 個のポインターへの配列ではなく、line80 個の配列にする必要があります。または、新しい行ごとにスペースを空けて、その行のアドレスを に入れることもできます。charcharmallocnames

于 2014-10-18T22:57:44.683 に答える