2012-05-22 2 views
2

Я уже спрашивал, как я могу разобрать отдельные слова из потока в переменные, и это работает отлично, но я не знаю, сколько слов пользователь даст в качестве входных данных. Я думал, что могу разобрать его в динамическом массиве, но я не знаю, с чего начать. Как я могу написать «для каждого слова в строке»?C++ parse getline в динамическом массиве

Это, как я разобрать слова в Варс:

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

Спасибо!

EDIT: Спасибо всем вам, я думаю, что узнал ... и все работает!

+0

Вы можете продолжать выскакивать его до переменной темпа и нажимать на вектор. – chris

ответ

5

Вы можете использовать std::vector<std::string> или std::list<std::string> - они обрабатывают изменение размера автоматически.

istringstream parse(line); 
vector<string> v; 
string data; 
while (parse >> data) { 
    v.push_back(data); 
} 
+0

Хорошо, мне действительно нравится Александр Бакулин, потому что я сразу это понимаю, но я думаю, что есть причина, по которой вы, ребята, рекомендуете вектор и push_back. Не могли бы вы объяснить это? Я не работал с вектором до – mohrphium

+0

@mohrphium, вектор - динамический массив, который управляет памятью для вас. – chris

+0

@mohrphium - если вы можете обработать элемент сразу (так что вам не нужно его хранить), ответ Александра отлично работает. Вы спрашивали о сохранении извлеченных значений. Коллекции STL предлагаются для сырых массивов, поскольку они справляются с тяжелым жизненным циклом для вас, делая управление памятью (например, изменение размера) автоматически и хорошо. Вы можете даже проверить границы, если хотите (например, используя функцию 'at()'); или просто используйте итераторы. Поскольку вы пишете программы на C++, вы должны изучить особенности языка - особенно STL - это сделает жизнь намного проще для вас в конечном итоге. – Attila

4

Вы можете написать следующий образом:

string line; 
getline(cin, line); 
istringstream parse(line); 
string word; 
while (parse >> word) 
    // do something with word 
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 будет расти по мере необходимости хранить любое количество слов предоставленный пользователем.

+0

Я понял ответ Атилы, но я не совсем понимаю, что такое итератор .. Что это делает? – mohrphium

+0

@mohrphium, если вы нажмете на ссылку в ответе, она даст полное описание. – hmjd

+0

@mohrphium, возможно, начинается с [wiki article] (http://en.wikipedia.org/wiki/Iterator), он объяснит, что такое итераторы. – jrok

1

Поскольку вы помечено вопрос с foreach, вот способом сделать это с стандартным for_each алгоритмом и C++ 11 лямбды:

#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. Его размер не обязательно должен быть известен во время компиляции.

Смежные вопросы