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

CS50 plurality项目check50检测异常:print_winner函数未通过Bob为获胜者的测试(本地运行正常)

CS50 plurality项目check50检测异常:print_winner函数未通过Bob为获胜者的测试(本地运行正常)

我仔细看了你的代码,找到问题根源了!你的print_winner函数在**只有单个候选人(比如测试场景里的Bob)**的情况下会出错,导致check50的测试不通过——虽然你本地测试多个候选人的场景没问题,但单个候选人的边界场景被忽略了。

问题出在这几行:

void print_winner(void)
{
    int c; // 这里没有初始化,是内存垃圾值!
    for (int i = 0; i < MAX; i++)
    {
        if (candidates[i+1].name == NULL)
        {
            break;
        }
        // ... 其他逻辑
    }
    // ... 后续用未初始化的c和候选人票数比较
}

当测试场景是只有Bob一个候选人时,第一个循环的i=0会立刻触发candidates[1].name == NULL的判断,直接跳出循环,这时候c根本没有被赋值,是内存里的随机垃圾值。后面的循环拿这个垃圾值和Bob的票数比较,大概率不相等,所以不会输出Bob,自然就没通过check50的测试。

另外你的循环用MAX(9)来遍历也没必要,直接用我们已经定义好的candidate_count更高效,也不会访问多余的数组元素。

修正后的print_winner函数:

void print_winner(void)
{
    // 先把最高票数初始化为第一个候选人的票数,避免未初始化的问题
    int max_votes = candidates[0].votes;
    
    // 遍历所有候选人,找到最高票数
    for (int i = 1; i < candidate_count; i++)
    {
        if (candidates[i].votes > max_votes)
        {
            max_votes = candidates[i].votes;
        }
    }
    
    // 遍历所有候选人,输出所有得票等于最高票数的获胜者
    for (int i = 0; i < candidate_count; i++)
    {
        if (candidates[i].votes == max_votes)
        {
            printf("%s\n", candidates[i].name);
        }
    }
    return;
}

顺便提个小bug(虽然check50没报错):

你的vote函数最后一行返回2,但函数返回类型是bool,只能返回true或false,这里应该改成return false;,不然会把非零值当作true返回,逻辑上是错误的:

bool vote(string name)
{
    for (int i = 0; i < candidate_count; i++) // 这里也建议改成candidate_count,不用MAX
    {
        if (strcmp(name, candidates[i].name) == 0)
        {
            candidates[i].votes++;
            return true;
        }
    }
    return false; // 把原来的return 2改成这个
}

把这两处修改后,再跑check50,那个Bob的测试应该就能顺利通过了,所有场景也都能正确处理。

备注:内容来源于stack exchange,提问作者Harrison

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:13:00