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
相关产品推荐
相关产品推荐

