我想用从用户输入的文件中读取的字符作为字符数组(即第一个元素是字符,第二个元素是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单元格的符号值。问题出在哪里?符号值是否被填充了?如果是,为什么它们被打印成问号?
任何帮助都将不胜感激。先谢了。
1条答案
按热度按时间6l7fqoea1#
“symbol”是一个char*(指针),指向长度为2的字符数组(1个字符+空字符)。您正在获取“?“作为输出,因为在
printf("%s\n", h.cells[i].head->symbol);
中您使用的是“%s”,但“%s”需要以null结尾的字符串,所以内容没有被正确地格式化为字符串。此外,readFile()
函数中的current
变量是指向长度为2的字符数组的指针,在循环的每次迭代中都被覆盖。这基本上意味着你在同一个内存位置存储了一堆指针,所以当你把它们打印出来的时候,“%s”找不到空字符,它只给你一个问号。这意味着你需要为每个“符号”分配内存。另外,请记住,当您不再使用free();
函数时,请使用该函数清除已分配的内存。字符串
}