将字符串向量转换为 int

Posted

技术标签:

【中文标题】将字符串向量转换为 int【英文标题】:converting string vectors to int 【发布时间】:2019-03-04 13:34:00 【问题描述】:

我必须编写一个程序来从文件中为学生读取信息,并且我制作了几个向量来保存所有这些信息。但是后来我需要总结所有学生的缺勤情况,所以我需要将它们转换为整数,但是当我尝试运行程序时,当它到达 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());

【问题讨论】:

首先请阅读Why is iostream::eof inside a loop condition considered wrong? 其次,为什么if 和索引?为什么不直接读取四个值呢?如while (read >> first_name >> last_name >> absence >> unatoned) ... ?然后变量可以是正确的类型,您不需要进行任何转换。请了解结构 代替旧的atoi,尝试使用stoi(在cplusplus.com/reference/string/stoi 中描述),如果仍然不起作用,捕获它可以抛出的异常(参见链接)和看看是哪一个。也有一些测试用例给我们,那是你输入的内容并打印absences[0] 的内容,然后你在这里发布。由于在某些评论中您说您已经检查过它,因此它可能包含一些控制字符,这使atoi 感到困惑。 (顺便说一句,OOP 方法是使用class Studentvector<Student>class Students。) 【参考方案1】:

如果absences 保持为空,则absences[0] 的行为未定义

absences 为空时使用absences.at(0) 会强制编译器抛出异常,因此更易于使用。

无论哪种方式,对于缺勤的数量,请简单地使用

auto a = absences.size();

【讨论】:

我确信缺席不是空的,因为当我尝试 cout 时,它会打印出应该在其中的内容。 那么,当你使用absences.at(0)时会发生什么? @Ruzzle 可能absences 选择中有一些空格,这就是为什么不在int 中转换【参考方案2】:

您应该将缺席向量更改为 int 的向量:

std::vector<int> abscences;

// rest of the code...

read &gt;&gt; var 指令将负责转换。

当然,&gt;&gt; 运算符在无效时不会写入整数。

【讨论】:

以上是关于将字符串向量转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

如何将字符从 int 转换为“出现”在控制台中?

将整数字符串转换为整数的2D向量

如何将向量转换为特定类型的字符串

在 C++ 中将字符串转换为向量

将 vector<int> 转换为分隔字符串

将 Vector<int> 转换为字符串 [重复]