Scrabble游戏第二名玩家得分异常加1问题排查求助
Scrabble游戏得分计算异常问题排查
问题现象
第二名玩家的得分会被莫名额外加1,导致结果错误。比如:
- 玩家1输入"all",预期得分3分(a:1 + l:1 + l:1)
- 玩家2输入"do",预期得分3分(d:2 + o:1)
- 实际结果却是玩家2得4分并获胜,本该平局的对局出现错误。
问题根源
问题出在compute_score函数的字符串处理逻辑中:
char lower_word[strlen(word)];
C语言中字符串必须以'\0'作为结束标志,而strlen(word)返回的是字符串中有效字符的数量,不包含结束符。这里创建的lower_word数组长度刚好等于原字符串的字符数,没有给'\0'预留空间。
当执行完字符转小写的循环后,lower_word没有终止符,后续调用strlen(lower_word)时会越界读取内存中的随机内容,导致遍历次数超出预期,多计算了一个无效字符的得分(刚好这个随机字符对应1分的字母,所以额外加了1)。
修复方案
有两种简单的修复方式:
方式1:给lower_word添加终止符
修改数组定义和循环后的代码:
// 多分配1个字节用于存储字符串终止符 char lower_word[strlen(word) + 1]; // 转小写循环保持不变 for (int j = 0; j < strlen(word); j++) { lower_word[j]= tolower(word[j]); } // 添加字符串终止符 lower_word[strlen(word)] = '\0';
方式2:直接遍历原字符串,无需额外数组
完全省去lower_word数组,直接在遍历原word时转小写判断,避免数组越界问题:
int compute_score(string word) { int score = 0; int letter = 0; for (int i = 0, n = strlen(word); i < n; i++) { char c = tolower(word[i]); if (c >= 'a' && c <= 'z') { letter = c - 'a'; // 用'a'代替97,代码更易读 score += POINTS[letter]; } // 非字母字符不加分,无需额外处理 } return score; }
验证修复
修复后重新测试原场景:
- 玩家1输入"all",得分3分
- 玩家2输入"do",得分3分
- 结果显示平局,符合预期。
内容的提问来源于stack exchange,提问作者Mr Omoach
相关产品推荐
相关产品推荐

