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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:01:07