ZyBooks判题报Range error但VS Code运行正常的C++程序问题
报错原因分析及解决说明
报错根本原因
你本地测试正常是因为所用的coordinates.txt刚好有5个坐标点,完全匹配代码里硬编码的循环上限j < 5,但ZyBooks判题系统会使用多组不同的测试用例,当测试用例中的坐标点数量不等于5时:
- 如果点数量少于5,访问
v1[j]就会出现下标越界,直接触发范围错误 - 另外C++中
vector的size()方法返回的是size_t(无符号长整型),用有符号的int类型变量和它比较,部分严格的编译环境会触发类型不匹配的报错或警告
修改后代码生效的原因
你修改后的代码解决了两个核心问题:
- 将循环上限从硬编码的
5改为v1.size(),遍历逻辑会匹配传入的Point向量的实际长度,不管测试用例有多少个坐标点都不会出现越界访问 - 将循环变量
i、j的类型改为long unsigned int,和size()返回的类型匹配,避免了类型不匹配的问题
额外优化建议
目前main函数里还存在两处硬编码逻辑,建议同步修改避免后续判题出错:
- 读取坐标点的循环不要写死
i < 5,改为自动读到文件结束:
while (ifs >> p) { originalPoints.push_back(p); } int n = originalPoints.size();
- 输出矩阵的循环不要写死
j < 5,改为匹配矩阵的实际列数:
for (int i = 0; i < matrix.size(); i++) { for (int j = 0; j < matrix[i].size(); j++) { ofs << matrix[i][j] << " "; } ofs << endl; }
内容的提问来源于stack exchange,提问作者fengvang24
相关产品推荐
相关产品推荐

