如何修复Hackerrank C++代码触发的Abort called报错问题
问题现象
在Hackerrank平台解答maximumDraws题目时,编写的C++代码运行触发报错:
Abort called: terminate called after throwing an instance of 'std::invalid_argument'
耗时3天尝试多种排查修复方式、其他渠道求助均未得到有效解答,需要可行的修复方案。
原始问题代码如下:
#include <bits/stdc++.h> using namespace std; string ltrim(const string &); string rtrim(const string &); /* * Complete the 'maximumDraws' function below. * * The function is expected to return an INTEGER. * The function accepts INTEGER n as parameter. */ int maximumDraws(int n) { int t; cin >> t; int rez; for (int i = 0; i < t; i++) { cin >> n; } for (int i = 0; i < t; i++) { cout << n++ << endl; } return 0; } int main() { ofstream fout(getenv("OUTPUT_PATH")); string t_temp; getline(cin, t_temp); int t = stoi(ltrim(rtrim(t_temp))); for (int t_itr = 0; t_itr < t; t_itr++) { string n_temp; getline(cin, n_temp); int n = stoi(ltrim(rtrim(n_temp))); int result = maximumDraws(n); fout << result << "\n"; } fout.close(); return 0; } string ltrim(const string &str) { string s(str); s.erase( s.begin(), find_if(s.begin(), s.end(), not1(ptr_fun<int, int>(isspace))) ); return s; } string rtrim(const string &str) { string s(str); s.erase( find_if(s.rbegin(), s.rend(), not1(ptr_fun<int, int>(isspace))).base(), s.end() ); return s; }
报错根因
- 输入流读取逻辑冲突:平台提供的
main函数模板已经通过getline完成了测试用例总数、单组用例参数的读取逻辑,在maximumDraws函数内额外通过cin重复读取输入,会打乱输入流指针位置,导致后续main函数读取测试用例时拿到空字符串或非数字内容,stoi处理无法转换为整数的字符串时,会直接抛出std::invalid_argument异常,未捕获该异常时程序就会触发abort终止。 - 函数逻辑完全偏离题目要求:本题核心是鸽巢原理,n种颜色的袜子,最坏情况抽取n只时每种颜色各1只,再多抽1只必然凑成一对,正确返回值应为
n+1。原有maximumDraws函数内额外加了输入读取、循环输出的无关逻辑,最终固定返回0,完全不符合题目输出要求。 - 输出逻辑不符合平台规范:平台要求将结果写入
OUTPUT_PATH对应的文件流,函数内通过cout打印的内容不会被判题逻辑识别,就算不报错也会被判为答案错误。
修复方案
只需要修改maximumDraws函数,删除函数内所有冗余的输入读取、控制台输出逻辑,仅保留核心计算返回即可,其余main、ltrim、rtrim的模板代码不需要改动。
修复后的maximumDraws函数代码:
int maximumDraws(int n) { return n + 1; }
替换后重新提交即可通过所有测试用例,不会再触发该异常。
内容的提问来源于stack exchange,提问作者XAdmin404
相关产品推荐
相关产品推荐

