C语言按字典规则替换单词时字符串末尾莫名多出U字符求助
问题根因排查
1. 原始copy2末尾多字符的问题
你构造copy2、copy3的时候没有手动添加字符串结束符'\0':
C语言的字符串以'\0'作为结束标识,你定义的copy2[60]是栈上局部数组,初始化时里面是随机的栈残留脏数据。你的逻辑只遍历了copy的有效字符赋值给copy2,但没有在最后一位补'\0',所以哈希函数计算的时候会把后面的脏字符也算进去,就出现了你看到的末尾多'U'的情况。
2. 修改后规则3失效的问题
你改后的代码依然存在两个核心问题:
- 还是没有给
copy2、copy3补结束符'\0':不管你循环怎么写,都必须在循环结束后加copy2[strlen(copy)] = '\0'、copy3[strlen(copy)] = '\0',否则字符串还是会读到脏数据。 - 你用的哈希表查找逻辑完全错误:你只判断了哈希桶第一个节点是否非空,直接取第一个节点的
data返回,既没有遍历哈希冲突的链表,也没有调用你结构体里定义的equalFunction比对key是否真的匹配。就算哈希值对得上,桶里第一个节点的key不是你要的目标值,你也会错误返回NULL,这就是你规则3失效的核心原因——你的字典里ipsum对应的哈希桶第一个节点可能是别的key,你直接返回NULL了。
另外还有几个隐藏bug你需要一并修复:
- 外层
while (c = getchar())的条件写错了:getchar返回EOF时是-1,这个条件永远为真,永远不会触发你写的EOF分支,应该改成while ((c = getchar()) != EOF)。 - 你的
word数组是固定60字节,没有做边界判断,如果输入超过60个连续字母会数组越界。
修复参考代码
你构造copy2和copy3的部分应该改成这样:
// 构造copy2:首字母大写其余小写 char copy2[60]; int len = strlen(copy); copy2[0] = toupper(copy[0]); for(int j = 1; j < len; j++){ copy2[j] = tolower(copy[j]); } copy2[len] = '\0'; // 必须补结束符 // 构造copy3:全小写 char copy3[60]; for(int j = 0; j < len; j++){ copy3[j] = tolower(copy[j]); } copy3[len] = '\0'; // 必须补结束符
另外哈希表查找部分必须改成遍历整个桶的链表,调用equalFunction比对key,示例逻辑:
char* lookup_dict(HashTable* dict, char* key) { unsigned int loc = dict->hashFunction(key) % dict->size; HashBucketEntry* cur = dict->buckets[loc]; while(cur != NULL) { if(dict->equalFunction(key, cur->key)) { return (char*)cur->data; } cur = cur->next; } return NULL; }
之后你替换原来的查找逻辑,调用这个函数拿word_in_dict、word_in_dict2、word_in_dict3即可。
内容的提问来源于stack exchange,提问作者norwegian_forest
相关产品推荐
相关产品推荐

