使用stoi

时间:2016-09-30 22:33:58

标签: c++ vector casting

在我的程序中,我首先将文件读入一个名为rosterList的字符串向量:

  

100

     

95

     

0

     

-1

     

110

     

80

     

90

     

-1

     

120

     

80

     

75

     

-1

     

130

     

60

     

55

     

-1

此步骤成功。我的目标是使用上面的数据创建Student个对象的向量。构造函数接受3个字符串作为参数:

Student::Student(string id,string g1,string g2)

为此,程序逐行循环遍历此字符串向量,如果转换为整数的行大于或等于100,则为id,然后通过传递动态创建新的Student对象id(当前行)和接下来的2行作为参数,并将对象添加到向量studentRecords

for (vector<string>::iterator it = rosterList.begin(); it<rosterList.end();it++){
        if(stoi(*it)>=100 || it == rosterList.begin()){ // error
            studentRecords.push_back(
                 Student(*it,*(it+1),*(it+2)) // dynamically push 
            );
        }
    }

并且存在动态错误:

  

libc ++ abi.dylib:以未捕获的类型异常终止   std :: invalid_argument:stoi:没有转换

我在网上查了一下,错误来自stoi无法转换。程序出错的地方?

2 个答案:

答案 0 :(得分:0)

您必须正确阅读文件....或 如果您对文件数据没有信心,请对数字内容进行验证。 下面是代码示例。 您在文件中读取的除数字内容之外的任何垃圾都将导致失败。 下面的代码编译并为您的想法。你可以优化它。

 #include <iostream>
    #include <cstring>
    #include <vector>
    #include <string>
    #include <algorithm>

    using namespace std;

std::vector<string> rosterList;
bool is_numeric(string strin)
{
    char const *str = strin.c_str();
    return all_of(str, str+strlen(str), 
                       [](unsigned char c) { return ::isdigit(c); });
}

int main(int argc, char *argv[])
{
    rosterList.push_back("100");
    rosterList.push_back(" ");
    rosterList.push_back("140");
    rosterList.push_back("180");


for (vector<string>::iterator it = rosterList.begin(); it<rosterList.end();it++){
        if(is_numeric(*it) && (stoi(*it)>=100 || it == rosterList.begin())){ // error

         std::cout<<stoi(*it)<<std::endl;
        }
    }
}

答案 1 :(得分:0)

我在您的代码中看到的一个问题是,当it+1是向量的最后2个位置时,您也会访问it+2it。这将尝试访问不存在的指针,因为它指向rosterList.end()之后。

在使用之前,您必须先测试it+1it+2<还是rosterList.end()