在我的程序中,我首先将文件读入一个名为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
无法转换。程序出错的地方?
答案 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+2
和it
。这将尝试访问不存在的指针,因为它指向rosterList.end()
之后。
在使用之前,您必须先测试it+1
和it+2
是<
还是rosterList.end()
。