从stdin获取数字列表并标记它们

时间:2009-07-17 21:43:17

标签: c++ tokenize stringstream

如何从用户处获取数字列表,然后将其标记化。

这就是我所拥有的,但除了第一个数字之外它没有得到任何东西:

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

using namespace std;

int main()
{

    string line = "";
    cin >> line;

    stringstream lineStream(line);

    int i;
    vector<int> values;

    while (lineStream >> i)
        values.push_back(i);

    for(int i=0; i<values.size(); i++)
        cout << values[i] << endl;

    system("PAUSE");
    return 0;
}

相关文章:
C++, Going from string to stringstream to vector
Int Tokenizer

6 个答案:

答案 0 :(得分:5)

这可能是将cin中的值读入容器的最简单方法:

#include <iostream>
#include <iterator>
#include <vector>

int main()
{
    std::vector<int> values;
    std::copy(
        std::istream_iterator<int>(std::cin), 
        std::istream_iterator<int>(),
        std::back_inserter(values));

    // For symmetry with the question copy back to std::cout
    std::copy(
        values.begin(),
        values.end(),
        std::ostream_iterator<int>(std::cout,"\n"));

}

答案 1 :(得分:4)

我相信cin&gt;&gt;在空格上打破,这意味着您只获得输入的第一个数字。

尝试:

getline(cin, line);

答案 2 :(得分:1)

就像Donnie在空白处提到cin中断一样,所以要克服这个问题我们可以使用'getline()',以下示例很有效:

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

using namespace std;

int main()
{

    string line = "";
    ::getline(std::cin,line,'\n');

    std::stringstream lineStream(line);

    int i;
    std::vector<int> values;

    while (lineStream >> i)
        values.push_back(i);

    for(int i=0; i<values.size(); i++)
        cout << values[i] << endl;

    system("PAUSE");
    return 0;
}

答案 3 :(得分:0)

在主

之上
string line = "";
getline (cin, line );
stringstream lineStream(line);

答案 4 :(得分:0)

是的,是getline的字符串版本,没有istream版本。

答案 5 :(得分:0)

好的:Pavel Minaev有最好的答案 但所有人都提到白色空间上的cin断裂 这是一件好事(因为它也忽略了空格);

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

using namespace std;

int main()
{

    int i;
    vector<int> values;

    // prefer to use std::copy() but this works.
    while (std::cin >> i)
    {
        values.push_back(i);
    }

    // prefer to use std::copy but this works.
    for(vector<int>::const_iterator loop = values.begin();loop != values.end();++loop)
    {
        cout << *loop << endl;
    }

    return 0;
}