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

CS50 Scrabble代码问题:字母A/a无法正常计算分数

Scrabble分数计算代码异常问题修复

问题根源

  1. 循环终止条件错误:第二个循环用score[j]!='\0'判断是否结束,但A/a转换后对应的索引是0,而'\0'的ASCII值也是0,导致处理到A时循环直接终止,后续字符无法处理,引发异常。
  2. 未初始化数组干扰:score数组是局部变量,未初始化的元素会保留随机垃圾值,可能破坏逻辑。
  3. 冗余转换操作:无需将word[i]强制转为int,C语言中字符本身就是ASCII数值,可直接参与运算。

修正后的代码

#include <cs50.h>
#include <stdio.h>
#include <ctype.h>

int main(void) {
    // Scrabble字母分数:索引0对应A,1对应B…25对应Z
    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};
    string word = get_string("Player 1: ");
    int total_score = 0;
    int i = 0;

    // 遍历单词计算分数
    while (word[i] != '\0') {
        int char_index;
        if (isupper(word[i])) {
            char_index = word[i] - 'A'; // 用字符常量替代硬编码65,可读性更强
        } else if (islower(word[i])) {
            char_index = word[i] - 'a'; // 用字符常量替代硬编码97
        } else {
            // 非字母字符不计分,直接跳过
            i++;
            continue;
        }
        total_score += POINTS[char_index];
        printf("%d\t", POINTS[char_index]);
        i++;
    }

    printf("\n总分数: %d\n", total_score);
    return 0;
}

关键修改说明

  • 移除冗余的score数组,直接在遍历过程中计算并累加分数,避免数组未初始化的问题。
  • 改用单词自身的'\0'控制循环,彻底解决A字符导致循环提前终止的问题。
  • 增加非字母字符处理逻辑,遇到空格、符号等直接跳过不计分。
  • 使用字符常量'A'/'a'替代硬编码的ASCII值,代码更易读且兼容不同字符集。
  • 利用total_score变量正确计算并输出总分,符合Scrabble游戏的核心需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 22:07:30