【发布时间】:2021-09-12 02:10:10
【问题描述】:
也许这真的很愚蠢,但我找不到解决它的方法。
typedef struct Node{
char *val;
struct Node *next;
}Node;
int main(){
Node *table; // hashtable
int n, i, j, choice, search;
//int hash_num, val;
char doc_name1[8] = "docA.txt";
char doc_name2[8] = "docB.txt";
char doc_name3[8] = "docC.txt";
char doc_name4[8] = "docD.txt";
// allocate table
table = (Node*) malloc(N*sizeof(Node)); //Iniciando la table con N = 30 posiciones
//make table "heads" NULL
for(i = 0; i < N; i++){
table[i].next = NULL;
}
printf("--h(x) = xmod%d--\n",N);
printf("\n\n");
while(1){
printf("1.Insertar registros\n");
printf("2.Delete a number\n");
printf("3.Search a number\n");
printf("4.Show Hash Table\n");
printf("0.Exit Programm\n");
printf("\n--------\n");
printf("Choice: ");
scanf("%d",&choice);
switch(choice){
case 0: return;
case 1:
table = insert(table, doc_name1);
//table = insert(table, doc_name2);
//table = insert(table, doc_name3);
//table = insert(table, doc_name4);
break;
case 2:
// delete a number
printf("Give a number: ");
scanf("%d",&search);
table = del(table, N, search);
printf("\n--------\n");
break;
case 3:
// search for a number
printf("Give a number: ");
scanf("%d",&search);
search_table(table, N, search);
printf("\n--------\n");
break;
case 4:
//print hashtable
printf("-HASHTABLE-\n\n");
print_table(table, N);
printf("\n--------\n");
break;
}
}
return 0;
}
Node *insert(Node *table, char *val){
Node *nn, *cur;
int lenght = strlen(val);
int hash_index = H(val);
nn = (Node*)malloc(sizeof(Node)); //Memoria para el nuevo nodo
nn->val = malloc((lenght+1)*sizeof(char));
strncpy(nn->val, val, lenght); //Valor del nuevo nodo va a ser lo que pasamos
nn->next = NULL; //Siguiente apunta a null
if(table[hash_index].next == NULL){ //Si donde apunta el indice a insertar no hay nada
table[hash_index].next = nn; //Insertamos ahí el nodo
return table; //Devolvemos la tabla
}
//Si no
cur = table[hash_index].next; //cur recibe el siguiente
while(cur->next != NULL){ //mientras que siga habiendo siguiente
cur=cur->next; //seguimos avanzando
}
cur->next = nn; //Inserta al final de la lista enlazada
return table; //Devuelve la tabla
}
这不是完整的代码,但我认为有必要展示我的问题。
问题在于(使用 CodeBlocks 调试器)我可以看到插入函数中的变量 lenght 如何在初始执行点初始化为值 8。但是当函数被调用并且对 doc_name 的引用被传递时,它变为 11。 到写这行的时候,我注意到它只显示了一次 8,现在它总是 11。
我可以看到它与传递参数 val 的字符比声明的字符多的事实有某种关系,但我该如何解决?
【问题讨论】:
-
char doc_name1[8] = "docA.txt";是错误的,因为 C 中的字符串需要 NUL 终止。所以需要 9 个字节的数组来存储 8 个字符的字符串。试试char doc_name1[] = "docA.txt";,它允许编译器计算出所需数组的大小。 -
@kaylum,因为
doc_nameX从未被修改过,所以它们不需要是"docX.txt"的副本。一个指针就足够了:char *doc_nameX = "docX.txt";。甚至更好:const char *doc_nameX = "docX.txt";
标签: c hashtable singly-linked-list c-strings strlen