You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:15:04