首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在引发“std::invalid_argument”的实例what()后调用terminate : stoi

在引发“std::invalid_argument”的实例what()后调用terminate : stoi
EN

Stack Overflow用户
提问于 2016-12-10 06:52:29
回答 1查看 123.8K关注 0票数 13

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

代码语言:javascript
运行
复制
"****@****:~> 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

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

代码语言:javascript
运行
复制
#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);
        }
    };

}
EN

回答 1

Stack Overflow用户

发布于 2016-12-10 07:01:36

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

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

异常

如果转换后的值超出结果类型的范围,或者如果基础函数( ERANGE.或std::strtoll)将errno设置为performed

  • std::out_of_range,则任何转换都不能为,则为
  • std::invalid_argument

std::terminate

当由于以下原因导致异常处理失败时,C++运行时将调用

std::terminate():

1) 抛出一个异常,没有捕获到(在这种情况下是否进行堆栈展开是由实现定义的)

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41070101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档