dja*_*min 16 c++ arrays string parsing
String是一个由数字组成的输入,我想在C++中将它转换成整数数组.
#include <string>
#include <iostream>
#include <sstream>
using std::string;
using std::stringstream;
using std::cout;
using std::endl;
int main(int argc,char** argv) {
string num="-24 2 90 24 50 76";
stringstream stream(num);
while(stream){
int n;
stream>>n;
cout<<n<<endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(GCC):
-24 2 90 24 50 76 76
为什么我会获得额外的价值,将它们转换为整数数组的效率是多少?
更新:
如果字符串流包含除空格之外的分隔符,如何解析此怎么办?例如:
string num="-24,2,90,24,50,76";
Seb*_*ach 21
在成功解析时未设置文件结束条件,您必须在解析后检查流的状态.
第二个76基本上只是纯粹的机会.一个不成功的解析使目标操作数不受影响,因为你没有初始化n,它可以是任何东西.
一个quickfix:
stream>>n;
if (stream)
cout<<n<<endl;
Run Code Online (Sandbox Code Playgroud)
更清洁的修复:
int n;
while(stream >> n){
cout<<n<<endl;
}
Run Code Online (Sandbox Code Playgroud)
要存储这些整数,规范的方法是使用std::vector元素的数量是未知的.示例用法:
std::vector<int> values;
int n;
while(stream >> n){
...do something with n...
values.push_back(n);
}
Run Code Online (Sandbox Code Playgroud)
但是,您可以在流上使用迭代器并使用以下内容:
// Use std::vector's range constructor
std::vector<int> values(
(std::istream_iterator<int>(stream)), // begin
(std::istream_iterator<int>())); // end
Run Code Online (Sandbox Code Playgroud)
小智 5
使用向量处理字符分隔整数列表的另一种方法(甚至可能更简单)更像是这样:
string str = "50,2,25,38,9,16";
vector<int> ints;
stringstream ss(str);
int n;
char ch;
while(ss >> n) {
if(ss >> ch)
ints.push_back(n);
else
ints.push_back(n);
}
Run Code Online (Sandbox Code Playgroud)
这样,您可以首先移过任何字符分隔(如果存在),然后默认返回获取整数并将它们添加到列表中(如果不存在)(也称为列表末尾)