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

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)

  • 最后,如果你想要一个int的向量,那么规范的方法是:`std :: vector <int> values((std :: istream_iterator <int>(stream)),(std :: istream_iterator <int>()) );`.没有循环,没有"push_back"; 一切都发生在构造函数中. (3认同)
  • @JamesKanze:但它是未定义的,因为`n`没有被初始化; 我对此进行了详细阐述.好的第二点,很高兴你回答了我的回答. (2认同)

小智 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)

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