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;
}
输出(GCC):
-24 2 90 24 50 76 76
为什么我会获得额外的价值,将它们转换为整数数组的效率是多少?
更新:
如果字符串流包含除空格以外的分隔符,如何解析此怎么办?
例如:
string num="-24,2,90,24,50,76";
答案 0 :(得分:21)
在成功解析时,文件结束条件
第二个76
基本上只是纯粹的机会。一个不成功的解析使目标操作数不受影响,因为你没有初始化n
,它可以是任何东西。
一个quickfix:
stream>>n;
if (stream)
cout<<n<<endl;
更清洁的修复:
int n;
while(stream >> n){
cout<<n<<endl;
}
要存储这些整数,如果元素数量未知,则规范方法是使用std::vector
。示例用法:
std::vector<int> values;
int n;
while(stream >> n){
...do something with n...
values.push_back(n);
}
但是,您可以在流上使用迭代器并使用以下内容:
// Use std::vector's range constructor
std::vector<int> values(
(std::istream_iterator<int>(stream)), // begin
(std::istream_iterator<int>())); // end
答案 1 :(得分:3)
使用向量处理字符分隔整数列表的另一种方法,甚至可能更简单一点,更像是这样:
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);
}
这样你可以先移动任何字符分隔(如果它们存在),然后默认返回抓取整数并将它们添加到列表中,如果它们不是(AKA列表的末尾)
答案 2 :(得分:2)
我不知道您是否找到了更新问题的答案。如果你没有,你可以通过代码
轻松完成for (string::iterator it = num.begin(); it != num.end(); ++it) {
if (*it == ',') {
*it = ' ';
}
else continue;
}
此代码删除所有冒号并用空格替换它们。那么你可以正常做到