我已经问过,我如何将流中的单个单词解析为变量,并且完美无缺,但我不知道用户将输入多少单词。我以为我可以把它解析成动态数组,但我不知道从哪里开始。我如何写“为每个单词排队”?
这就是我将这些单词解析为变量的方法:
string line;
getline( cin, line );
istringstream parse( line );
string first, second, third;
parse >> first >> second >> third;
谢谢!
编辑:感谢你们所有人,我想我知道了......它确实有效!答案 0 :(得分:5)
您可以使用std::vector<std::string>
或std::list<std::string>
- 他们会自动处理调整大小。
istringstream parse( line );
vector<string> v;
string data;
while (parse >> data) {
v.push_back(data);
}
答案 1 :(得分:5)
有可能将std::vector
与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
将根据需要增长,以存储用户提供的任意数量的字词。
答案 2 :(得分:4)
您可以写如下:
string line;
getline( cin, line );
istringstream parse( line );
string word;
while (parse >> word)
// do something with word
答案 3 :(得分: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
}
);
}
vector
正是你所要求的 - 一个动态可调整大小的数组,你几乎总是喜欢它而不是C风格的数组。它的大小不需要在编译时知道。