C语言 为什么访问哈希表的单元格会返回问号?

oug3syen  于 2023-11-16  发布在  其他
关注(0)|答案(1)|浏览(91)

我想用从用户输入的文件中读取的字符作为字符数组(即第一个元素是字符,第二个元素是NULL字符的字符数组-如“a”或“b”......你明白了)来填充哈希表。
为此,我创建了一个带有基本操作的哈希表结构沿着(见下文)

// hashtable structure
struct hashTable{
    linkedList* cells;
    int capacity;
};
typedef struct hashTable hashTable;

// hashtable function prototypes

int hashFunction(char* s, int capacity);

hashTable creation_hashTable(int capacity);

bool presence_test_hashTable(hashTable h, char* s);

void insertion_hashTable(hashTable h, char* s);

void increment_hashTable(hashTable h, char* s);

字符串
基于链表结构(见下文)。

// linked list node 
struct node{
    char* symbol;
    int weight;
    struct node* succ;
};
typedef struct node node;

// linked list structure
struct linkedList{
    node* head;
};
typedef struct linkedList linkedList;

// linked list function prototypes

linkedList creation_linkedList();

bool search_linkedList(linkedList l, char* s);

void insertion_linkedList(linkedList *l, node n);


所有与hashTable和linkedList结构相关的函数似乎都工作得很好。下面是我创建的填充hashtable的函数:

hashTable readFile(char* fileName){
    FILE* p = fopen(fileName, "r");
    assert(p); 
    hashTable* h = malloc(sizeof(hashTable));
    *h = creation_hashTable(fileLength(fileName));
    char* current = malloc(2);
    current[1] = 0;
   
    while (!feof(p)){
        current[0] = fgetc(p);
        if (!presence_test_hashTable(*h,current))
            insertion_hashTable(*h,current);
        increment_hashTable(*h,current);
    }

    fclose(p);
    return *h;
}


该函数似乎工作正常:当我打印出非NULL单元格的权重值时,我得到了相应的权重。
但是,在终端中编译并运行以下内容:

int main(){
    hashTable h = readFile("li_def.txt"); // lorem ipsum filler text file
    for (int i = 0; i < h.capacity; ++i){
        if (h.cells[i].head){ 
            printf("%s\n", h.cells[i].head->symbol);
        }
    }

    exit(0);
}


返回问号行,如

?
?
...


坦率地说,我根本不知道这里发生了什么。如上所述,我能够毫无问题地访问单元格的权重值,所以在基本层面上,函数正在做它应该做的事情。
我不知道如何处理这个问题,因为我不能访问非NULL单元格的符号值。问题出在哪里?符号值是否被填充了?如果是,为什么它们被打印成问号?
任何帮助都将不胜感激。先谢了。

6l7fqoea

6l7fqoea1#

“symbol”是一个char*(指针),指向长度为2的字符数组(1个字符+空字符)。您正在获取“?“作为输出,因为在printf("%s\n", h.cells[i].head->symbol);中您使用的是“%s”,但“%s”需要以null结尾的字符串,所以内容没有被正确地格式化为字符串。此外,readFile()函数中的current变量是指向长度为2的字符数组的指针,在循环的每次迭代中都被覆盖。这基本上意味着你在同一个内存位置存储了一堆指针,所以当你把它们打印出来的时候,“%s”找不到空字符,它只给你一个问号。这意味着你需要为每个“符号”分配内存。另外,请记住,当您不再使用free();函数时,请使用该函数清除已分配的内存。

hashTable readFile(char* fileName) {
FILE* p = fopen(fileName, "r");
assert(p);
hashTable* h = malloc(sizeof(hashTable));
*h = creation_hashTable(fileLength(fileName));
char* current = malloc(2);
current[1] = '\0'; 

while (!feof(p)) {
    current[0] = fgetc(p);
    if (!presence_test_hashTable(*h, current)) {
        char* new_symbol = malloc(2); 
        new_symbol[0] = current[0]; 
        new_symbol[1] = '\0'; 
        insertion_hashTable(*h, new_symbol);
    }
    increment_hashTable(*h, current);
}

free(current);
fclose(p);
return *h;

字符串
}

相关问题