g++ -std=c++0x m1.cpp stimulation.h stims.h Task.h exoskeleton.h A-6ren">
gpt4 book ai didi

c++ - 在抛出 'std::invalid_argument' what() : stoi 实例后终止调用

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:39 32 4
gpt4 key购买 nike

stoi 函数使程序崩溃并显示错误消息

"****@****:~> g++ -std=c++0x m1.cpp stimulation.h stims.h Task.h exoskeleton.h ARAIG_Sensors.h Profile.h

ARAIG_Sensors.h:1:9: warning: #pragma once in main file [enabled by default]

Profile.h:1:9: warning: #pragma once in main file [enabled by default]

*****@****:~> a.out StimulationConfig.csv TaskConfiguration.csv SampleProfileConfig.csv SampleOutput.txt

First : a.out
Second : StimulationConfig.csv
terminate called after throwing an instance of 'std::invalid_argument'
what(): stoi
Aborted

我不明白为什么,有一个实例被传递到函数中,但仍然返回错误。有人可以帮我解决问题吗?

#pragma once
#include <string>
#include <vector>
#include "Task.h"
#include <ostream>
#include "ARAIG_Sensors.h"
namespace m1
{
class Profile
{
ARAIG_Sensors araig;
std::vector<Task> ToRun;
std::vector<Task> Completed;
std::string studentFN;
std::string studentLN;
std::string studentSN;
std::string flightFN;
std::string flightLN;
std::string flightEN;
std::ostream& os;

struct calibration {
int Max;
int Min;
};

calibration cal;

public:
Profile(std::string fn, std::ostream& o, ARAIG_Sensors& a) : os(o)
{
araig = a;

//parsing student
std::ifstream infile(fn);
std::string line;
std::getline(infile, line);
int f = line.find_first_of(",");
studentFN = line.substr(0, f);
line = line.substr(f + 1);
f = line.find_first_of(",");
studentLN = line.substr(0, f);
studentSN = line.substr(f + 1);

//parsing flight
std::getline(infile, line);
f = line.find_first_of(",");
flightFN = line.substr(0, f);
line = line.substr(f + 1);
f = line.find_first_of(",");
flightLN = line.substr(0, f);
flightEN = line.substr(f + 1);

//parsing calibration
std::getline(infile, line);
f = line.find_first_of(",");
cal.Min = stoi(line.substr(0, f));
std::cout << cal.Min << std::endl;
line = line.substr(f + 1);
cal.Max = stoi(line);



std::list<Task> temp = araig.gettasks();
while (std::getline(infile, line))
{
for (std::list<Task>::iterator i = temp.begin(); i != temp.end(); i++)
{
if ((*i).getName() == line)
{
ToRun.push_back(*i);
break;
}



}

}

}
void displayToRun()
{
for (std::vector<Task>::iterator i = ToRun.begin(); i != ToRun.end(); i++)
{
(*i).execute(os);
}
}
void displayCompleted()
{
for (std::vector<Task>::iterator i = Completed.begin(); i != Completed.end(); i++)
{
(*i).execute(os);
}
}
void displayNext()
{
std::vector<Task>::iterator i = ToRun.begin();
(*i).execute(os);
}
void displayLast()
{
std::vector<Task>::iterator i = Completed.end();
(*i).execute(os);
}
void Run()
{
//excute next Task and move Task to Completed
std::vector<Task>::iterator i = ToRun.begin();
Task t = *i;
t.execute(os);
ToRun.erase(i);
Completed.push_back(t);
}
};

}

最佳答案

这意味着你正在给 std::stoi() 错误的输入,所以它会抛出一个 std::invalid_argument你没有捕捉到的异常。

std::stoi, std::stol, std::stoll :

Exceptions

  • std::invalid_argument if no conversion could be performed

  • std::out_of_range if the converted value would fall out of the range of the result type or if the underlying function (std::strtol or std::strtoll) sets errno to ERANGE.

std::terminate

std::terminate() is called by the C++ runtime when exception handling fails for any of the following reasons:

1) an exception is thrown and not caught (it is implementation-defined whether any stack unwinding is done in this case)

您需要仔细检查您尝试转换为整数的输入字符串值。它们不代表整数。

关于c++ - 在抛出 'std::invalid_argument' what() : stoi 实例后终止调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41070101/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com