stoi"在抛出'std::invalid argument'实例后终止调用

stoi "terminate called after throwing an instance of 'std::invalid argument'

本文关键字:实例 argument 终止 调用 invalid stoi std      更新时间:2023-10-16

我目前正在处理一个动态编程问题,为了提高我的技能,我决定用C++而不是通常的Java/C#来编写它。然而,我遇到了一个我无法理解的错误。编辑:我将在这里发布我的整个解决方案:

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */
    int linecounter = 0;
    int value = -1;
    int differentCoins = -1;
    int uniqueCoinCount = -1;
    std::vector<std::vector<int>> array;
    int *uniqueCoins;
    int totalAmount = -1;
    for (std::string line; std::getline(std::cin, line); ) {
        if (linecounter % 2 == 0) {
            string inputs[2];
            int i = 0;
            stringstream ssin(line);
            while (ssin.good() && i < 2){
                ssin >> inputs[i];
                ++i;
            }
            cout << inputs[0];
            cout << inputs[1];
            totalAmount = std::stoi(inputs[0]);
            uniqueCoinCount = std::stoi(inputs[1]);
            uniqueCoins = new int[uniqueCoinCount + 1];
        }
        if (linecounter % 2 == 1) {
            array.resize(uniqueCoinCount + 1, std::vector<int>(totalAmount + 1));
            for (int i = 0; i < totalAmount; i++) {
                array[i][0] = 0;
            }
            for (int i = 0; i <= uniqueCoinCount; i++) {
                array[0][i] = 1;
            }

            stringstream ssin(line);
            int coinCounter = 0;
            uniqueCoins[coinCounter] = 0;
            coinCounter++;
            while (ssin.good() && coinCounter < uniqueCoinCount + 1){
                ssin >> uniqueCoins[coinCounter];
                coinCounter++;
            }
            for (int i = 1; i < totalAmount; i++) {
                for (int j = 1; j <= uniqueCoinCount; j++) {
                    int totalExcludingCoin = array[i][j - 1];
                    if (uniqueCoins[j] <= i) {
                        array[i][j] = totalExcludingCoin + array[i - uniqueCoins[j]][j];
                    }
                    else {
                        array[i][j] = totalExcludingCoin;
                    }
                }
            }
        }
        linecounter++;
    }
    //cout << array[totalAmount][uniqueCoinCount + 1];
}

当我使用cout << inputs[0]时,我可以看到它打印出4。然而,hackerbank编译器给了我一个错误,说

"在抛出'std::invalid_argument'的实例后调用terminate
what(): stoi"

可能是什么问题?我也尝试过atoi(),它会返回40而不是4,可能是因为atoi出错时返回0?是因为它读取了null终止符还是什么?

感谢

以下是hackerlink的输出:

尝试得不错,但你没有通过这个测试用例。输入(stdin)4 31 2 3您的输出(stdout)43预期输出4.编译器消息中止调用错误(stderr)在引发"std::invalid_argument"的实例后调用terminatewhat():stoi
        while (ssin.good() && i < 2){
            ssin >> inputs[i];
            ++i;
        }

您正在使用状态报告功能来预测未来。good函数不会告诉您未来操作的结果,只告诉您过去操作的结果。实际上,您需要检查操作(ssin >> inputs[i])是否成功,而不是假设如果流在过去是好的,就必须成功。

在竞争性编程中,出于速度原因,通常使用scanf:http://www.cplusplus.com/reference/cstdio/scanf/

另一个好方法是使用cin。我相信它有点慢,但我已经过得很好了。

大多数比赛从stdin读取的示例代码。

int main() {
  int n;
  cin >> n;
  std::vector<int> xs(n);
  for (int i = 0; i < n; ++i) { 
    cin >> xs[i];
  }
  // do actual computation
}