拆分需要在向量中写入哪些组件的字符串

时间:2014-12-09 22:09:07

标签: c++

我的问题听起来像这样:我输入一个巨大的字符串,数字用空格分隔。我需要拆分此字符串并将组件放在向量中,然后使用其组件。 (然后转换为整数bla bla ...)。

我在这里搜索了这个,但我完全不了解一些事情,所以请稍微解释一下。

还有一个问题:为什么下面再返回一个“Substring:”?

int main()
{
    string s("10 20 30 50 2000");
    istringstream iss(s);

    while (iss)
    {
        string sub;
        iss >> sub;
        cout << "Substring: " << sub << endl;
    }
    system("pause");
    return 0;
}

3 个答案:

答案 0 :(得分:2)

  

为什么下面再返回一个“Substring:”?

因为你的循环被打破了;你在读取之前检查流状态。这与下面描述的问题相同:

答案 1 :(得分:0)

首先计算这样的空格数量:

int i = counter;

for( size_t i = 0; i < s.size(); ++i )
{
    if( ' ' == s[i] )
    {
         ++counter;
    }
}

之后你必须在另一个子串中循环字符串s。

答案 2 :(得分:0)

尝试以下方法

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator>

int main()
{
    std::string s( "10 20 30 50 2000" );

    std::istringstream is( s );

    std::vector<std::string> v( ( std::istream_iterator<std::string>( is ) ),
                                std::istream_iterator<std::string>() );

    for ( const std::string &t : v ) std::cout << t << std::endl;                                

    return 0;
}

输出

10
20
30
50
2000

您最初可以将向量定义为类型std::vector<int>,并在向量初始化中使用迭代器std::istream_iterator<int>

至于你的第二个问题,那么在输出字符串之前你必须检查它是否被读取。所以正确的循环看起来像

string sub;

while ( iss >> sub )
{
    cout << "Substring: " << sub << endl;
}