CS50 Scrabble代码问题:字母A/a无法正常计算分数
Scrabble分数计算代码异常问题修复
问题根源
- 循环终止条件错误:第二个循环用
score[j]!='\0'判断是否结束,但A/a转换后对应的索引是0,而'\0'的ASCII值也是0,导致处理到A时循环直接终止,后续字符无法处理,引发异常。 - 未初始化数组干扰:
score数组是局部变量,未初始化的元素会保留随机垃圾值,可能破坏逻辑。 - 冗余转换操作:无需将
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
相关产品推荐
相关产品推荐

