20

一个字符串作为输入给出,它由数字组成,我想将它转换为 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";

4

3 回答 3

21

成功解析后设置文件结束条件,您必须在解析后检查流的状态。

第二个76基本上只是纯粹的机会。不成功的解析使目标操作数保持不变,并且因为您没有初始化n,所以它可以是任何东西。

快速修复:

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
于 2013-07-18T13:37:41.453 回答
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);
}

这样,您可以先跳过任何字符分隔符(如果它们存在),然后默认返回抓取整数并将它们添加到列表中(如果它们不存在)(也就是列表的末尾)

于 2015-08-26T12:39:29.693 回答
2

我不知道您是否找到更新问题的答案。如果不这样做,您可以通过代码轻松完成

for (string::iterator it = num.begin(); it != num.end(); ++it) {
    if (*it == ',') {
        *it = ' ';
    }
    else continue;
}

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

于 2015-03-07T06:59:38.243 回答