将字符串向量转换为整数

3

我需要编写一个程序从文件中读取学生的信息,并使用一些向量来保存这些信息。但是,我需要将所有学生的缺席情况加总,所以需要将其转换为整数。但是,当我尝试转换时,程序会运行,但在达到atoi部分时立即崩溃。

while(!read.eof()) {
    if(i==4){
        i=0;
    }

    read>>b;

    if(i==0){ names.push_back(b); }
    if(i==1){ last_name.push_back(b); }
    if(i==2){ absences.push_back(b); }
    if(i==3){ unatoned.push_back(b); }
    i++;
}

int a = atoi(absences[0].c_str());

1
其次,为什么要使用if和索引?为什么不直接读取这四个值呢?就像这样 while (read >> first_name >> last_name >> absence >> unatoned) { ... }?然后变量可以直接使用正确的类型,而且你也不需要进行任何转换。请学习结构体 - Some programmer dude
不要使用旧的 atoi,尝试使用 stoi(在 http://www.cplusplus.com/reference/string/stoi/ 上有描述),如果仍然无法正常工作,请捕获它可能抛出的异常(请参见链接)并查看是哪一个。还需要为我们提供一些测试用例,即您输入的内容,并打印 absences[0] 的内容,然后在此处发布。由于您在某个评论中说已经检查过它,因此可能存在一些控制字符会使 atoi 混淆。(顺便说一句,面向对象的方法是拥有一个 class Student,并且要么使用 vector<Student>,要么使用 class Students。) - Aziuth
2个回答

3
如果 absences 保持为空,则 absences[0] 的行为是未定义的。
absences 为空时使用 absences.at(0) 强制编译器抛出异常,因此更易于使用。
无论哪种方式,对于缺勤次数,请简单使用。
auto a = absences.size();

我确定absences不是空的,因为当我尝试使用cout打印它时,它会打印出应该在其中的内容。 - Ruzzle
当您使用 absences.at(0) 时会发生什么? - Bathsheba
@Ruzzle 可能在 absences 选择中有一些空格,因此没有转换为 int - Eklavya

0
你应该将你的 absences 向量改为整型向量:
std::vector<int> abscences;

// rest of the code...

read >> var 指令会完成转换。

当然,如果无效的话,>> 运算符不会写入整数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接