CS50 Runoff问题:使用strcmp触发Segmentation Fault排查求助
CS50 Runoff投票函数段错误修复
你的vote函数触发段错误主要有两个问题:
- 循环边界用错了:代码里写的是
i < voter_count,但遍历候选人应该用候选人总数candidate_count,如果选民数voter_count比候选人数量多,循环会超出candidates数组的范围,访问非法内存直接崩掉,尤其是输入非候选人姓名时,循环会一直跑越界。 - 没处理空指针情况:直接调用
strlen(name)时,如果name是NULL(比如输入无效的空值),strlen会直接触发段错误,因为它不能处理空指针参数。
修正后的代码:
bool vote(int voter, int rank, string name) { // 先排查name为空指针或空字符串的情况 if (name == NULL || strlen(name) == 0) { return false; } // 遍历候选人数组,用正确的边界candidate_count for (int i = 0 ; i < candidate_count ; i++) { if (strcmp(candidates[i].name , name) == 0) { preferences[voter][rank] = i; return true; } } return false; }
修正说明
- 先判断
name是否为NULL,再检查字符串长度,避免strlen和strcmp因空指针崩溃; - 把循环条件改成
i < candidate_count,确保只在候选人数组的合法索引范围内遍历,不会越界访问内存。
内容的提问来源于stack exchange,提问作者yhoo
相关产品推荐
相关产品推荐

