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

Plurality投票程序vote函数失效及代码优化技术求助

CS50 Plurality投票程序问题排查与优化

问题1:vote函数无法正确识别有效候选人姓名

  • 原因分析:
    1. 字符串比较逻辑错误:C语言中不能直接用==比较字符串内容,==实际对比的是字符串指针的内存地址。输入的name是get_string分配的新内存空间,和candidates[j].name指向的argv内存地址完全不同,因此永远无法匹配成功。
    2. 循环边界错误:sizeof(candidates)计算的是整个候选人数组的总字节大小(即MAX * sizeof(candidate)),而非实际参与选举的候选人数量candidate_count,这会导致循环超出有效候选人范围,访问未初始化的数组元素。

问题2:改用while循环时无效投票导致无限循环

  • 原因分析:
    原代码用for循环遍历固定数量的选民,每轮无论投票有效与否都会消耗一个选民名额。如果改成while循环时,若未合理控制剩余选民计数(比如输入无效投票时未减少剩余名额),就会一直停留在请求输入的步骤,触发无限循环。

代码修复与优化建议

修复vote函数

修正字符串比较方式和循环边界:

bool vote(string name)
{
    for (int j = 0; j < candidate_count; j++)
    {
        // 使用strcmp比较字符串内容,返回0表示两字符串相等
        if (strcmp(candidates[j].name, name) == 0)
        {
            candidates[j].votes++;
            return true;
        }
    }
    return false;
}

解决while循环的无限循环问题

如果要改用while循环处理投票,确保只有有效投票才消耗选民名额:

// 替换main函数中原有的投票循环
int remaining_voters = voter_count;
while (remaining_voters > 0)
{
    string name = get_string("Vote: ");
    if (vote(name))
    {
        remaining_voters--;
    }
    else
    {
        printf("Invalid vote.\n");
    }
}

补全print_winner函数(可选)

实现打印所有得票最高的候选人:

void print_winner(void)
{
    int max_votes = 0;
    // 先统计最高票数
    for (int i = 0; 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);
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:10:22