Plurality投票程序vote函数失效及代码优化技术求助
CS50 Plurality投票程序问题排查与优化
问题1:vote函数无法正确识别有效候选人姓名
- 原因分析:
- 字符串比较逻辑错误:C语言中不能直接用
==比较字符串内容,==实际对比的是字符串指针的内存地址。输入的name是get_string分配的新内存空间,和candidates[j].name指向的argv内存地址完全不同,因此永远无法匹配成功。 - 循环边界错误:
sizeof(candidates)计算的是整个候选人数组的总字节大小(即MAX * sizeof(candidate)),而非实际参与选举的候选人数量candidate_count,这会导致循环超出有效候选人范围,访问未初始化的数组元素。
- 字符串比较逻辑错误:C语言中不能直接用
问题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
相关产品推荐
相关产品推荐

