将包含数字的字符串解析为整数数组

时间:2013-07-18 13:32:23

标签: 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;
}

输出(GCC):

  

-24 2 90 24 50 76 76

为什么我会获得额外的价值,将它们转换为整数数组的效率是多少?

更新:

如果字符串流包含除空格以外的分隔符,如何解析此怎么办? 例如:  string num="-24,2,90,24,50,76";

3 个答案:

答案 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;
}

此代码删除所有冒号并用空格替换它们。那么你可以正常做到