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

CS50 Scrabble练习输入"Question!"时Q字母得分为0问题求助

代码问题梳理

你的代码存在以下几处直接导致异常的问题:

  • 索引数组长度不足
    你定义w1index、w2index时,数组长度设置为length_word1 - 1和length_word2 - 1,但单词共有length_word1个字符,需要对应存储length_word1个索引值。数组长度少了1,导致首字符对应的索引位置没有合法内存分配,属于数组越界访问,存储的首字符索引值是随机垃圾值,自然会匹配到错误的分值(大概率是POINTS最后一位的0分),这就是Q字母分值判定为0的核心原因。
  • 分值变量未初始化
    你声明score1和score2时没有赋初始值0,两个变量的初始值是内存中的随机垃圾值,累加计算后的总分完全不符合预期。
  • 字符匹配逻辑冗余易出错
    额外定义LETTERS数组循环比对字符的逻辑非常冗余,且循环重置counter的逻辑很容易触发边界异常。完全可以直接用C标准库的toupper()/tolower()函数把字符统一转为大写/小写,再通过字符 - 'A'的计算直接得到对应字母的索引,既简洁又不会出错。
  • 声明的函数未使用
    你提前声明了int compute_score(string word);函数,但既没有实现函数逻辑,也没有在主函数中调用,属于冗余代码。
修复方案
  1. 修改索引数组的长度,改为和单词长度一致:
int w1index[length_word1];
int w2index[length_word2];
  1. 初始化分值变量为0:
int score1 = 0;
int score2 = 0;
  1. (可选优化)直接替换现有复杂的字符匹配逻辑,实现声明的compute_score函数简化代码:
int compute_score(string word) {
    int score = 0;
    // 索引0对应A,1对应B,依次类推
    int points[] = {1,3,3,2,1,4,2,4,1,8,5,1,3,1,1,3,10,1,1,1,1,4,4,8,4,10};
    for (int i = 0, len = strlen(word); i < len; i++) {
        if (isalpha(word[i])) {
            score += points[toupper(word[i]) - 'A'];
        }
    }
    return score;
}

主函数中直接调用函数即可得到分值,不需要再写复杂的循环匹配逻辑:

int score1 = compute_score(word1);
int score2 = compute_score(word2);

内容的提问来源于stack exchange,提问作者Helhkr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 02:15:02