2

我已经问过,如何将流中的单个单词解析为变量,并且效果很好,但我不知道用户将输入多少单词。我以为我可以把它解析成一个动态数组,但我不知道从哪里开始。我怎样才能写“每行字”?

这就是我将单词解析为变量的方式:

string line;
getline( cin, line );
istringstream parse( line );
string first, second, third;
parse >> first >> second >> third;

谢谢!

编辑:感谢你们所有人,我想我知道了......而且它有效!

4

4 回答 4

5

您可以使用std::vector<std::string>std::list<std::string>-- 他们自动处理调整大小。

istringstream parse( line ); 
vector<string> v;
string data; 
while (parse >> data) {
  v.push_back(data);
}
于 2012-05-22T11:09:34.300 回答
5

一种可能性是使用std::vectorwith istream_iterator

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

int main()
{
    std::istringstream in(std::string("a line from file"));

    std::vector<std::string> words;
    std::copy(std::istream_iterator<std::string>(in),
              std::istream_iterator<std::string>(),
              std::back_inserter(words));

    return 0;
}

vector根据需要增长以存储用户提供的任何数量的单词。

于 2012-05-22T11:11:27.940 回答
4

你可以这样写:

string line;
getline( cin, line );
istringstream parse( line );
string word;
while (parse >> word)
    // do something with word
于 2012-05-22T11:09:38.660 回答
1

既然您用 标记了问题foreach,这里有一种使用标准for_each算法和 C++11 lambdas 的方法:

#include <string>
#include <sstream>
#include <iostream>
#include <algorithm> // for for_each
#include <vector>    // vector, obviously
#include <iterator>  // istream_iterator
using namespace std;

int main()
{
    string line;
    vector<string> vec;
    getline(cin, line);

    istringstream parse(line);

    for_each(
        istream_iterator<string>(parse),
        istream_iterator<string>(),

        // third argument to for_each is a lambda function
        [](const string& str) {
             // do whatever you want with/to the string
             vec.push_back(str);  // push it to the vector
        }
    );
 }

Avector正是您所要求的 - 一个动态可调整大小的数组,您应该几乎总是更喜欢 C 风格的数组。它的大小不需要在编译时知道。

于 2012-05-22T11:24:08.117 回答