从标准输入获取数字列表并标记它们

Posted

技术标签:

【中文标题】从标准输入获取数字列表并标记它们【英文标题】:get list of numbers from stdin and tokenize them 【发布时间】:2009-07-17 21:43:17 【问题描述】:

如何从用户那里获取数字列表,然后对它们进行标记。

这是我所拥有的,但除了第一个数字之外什么都没有:

#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 vectorInt Tokenizer

【问题讨论】:

在一行中输入多个数字,以空格分隔,然后回车,它将获取所有数字。问题是您只阅读第一行。 【参考方案1】:

这可能是从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"));


【讨论】:

【参考方案2】:

我相信 cin >> 会在空格处中断,这意味着您只会输入第一个数字。

尝试:

getline(cin, line);

【讨论】:

如果你把它放在一个循环中就不行:while(std::cin >> i) /* Do STUFF */ 为什么要循环,什么时候可以一次调用?【参考方案3】:

就像 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;

【讨论】:

【参考方案4】:

在主目录之上

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

【讨论】:

【参考方案5】:

是的,并且是字符串版本的 getline,而不是 istream 版本。

【讨论】:

【参考方案6】:

好的: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;

【讨论】:

以上是关于从标准输入获取数字列表并标记它们的主要内容,如果未能解决你的问题,请参考以下文章

将数字从标准输入获取到 C 中的数组

从标准输入将数字读入寄存器?加载 scanf 结果

Android 中输入类型 = 文件标记中非标准属性“捕获”的行为

你如何从标准输入读取?

如何加载程序读取标准输入并在 gdb 中获取参数?

Python 使用 input() 逐行遍历标准输入