You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:39:30