2012-02-19 2 views
2

Я пытаюсь прочитать несколько целых чисел из одной входной строки в массив например. Ввод: 100 200 300 400, поэтому массив равен: a [0] = 100, a [1] = 200, a [2] = 300, a [3] = 400 Вещь в том, что число целых чисел неизвестно , поэтому размер массива неизвестен.Чтение списка целых чисел в одной строке ввода в C++

+0

Что вы попробовали? –

ответ

7

Вы должны использовать контейнер, который автоматически изменяет размеры, например std::vector.

Например, что-то вроде этого:

#include <string> 
#include <iostream> 
#include <sstream> 
#include <utility> 
#include <iterator> 

std::string line; 
getline(instream, line); 
std::istringstream this_line(line); 
std::istream_iterator<int> begin(this_line), end; 
std::vector<int> values(begin, end); 
+0

О, действительно, еще лучше :-) –

+0

Я думаю, вы хотели использовать 'std :: istream_iterator ', и вы хотели использовать соответствующие круглые скобки, чтобы избежать наиболее неприятного разбора. –

+0

@ DietmarKühl: Спасибо, что вы указали неправильное имя. Это правильный способ избежать наиболее неприятного разбора? –

3

Вы можете использовать std::vector для этого:

std::vector<int> myVector; 

std::string line; 
std::getline(std::cin, line); 
std::istringstream os(line); 

int i; 
while(os >> i) 
    myVector.push_back(i); 

Этот код необходимо следующее включает: <iostream>, <string>, <sstream> и <vector>.

+1

Остановите 'злоупотребление namepsace std;'. Это действительно очень грязная привычка, и она разрушает умы всех тех новичков ... –

+0

@KerrekSB: Я попробую. – LihO

+0

Я не думаю, что это так плохо, как это делает Керрек, но пример кода должен быть еще более нетронутым, чем производственный код. –

1

Inserters и поток итераторы могут сделать это красиво:

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

std::vector<int> numbers; 

std::copy(std::istream_iterator<int>(std::cin), 
      std::istream_iterator<int>(), 
      std::back_inserter(numbers)); 

Или, как @Ben Фойгт имеет его, построить вектор от входа в один идти (если это опция):

std::vector numbers(std::istream_iterator<int>(std::cin), 
        std::istream_iterator<int>()); 

Вы можете заменить std::cin б y подходящий поток строк, если ваши требования к вводу более сложны.

+0

Boo to 'std :: copy',' std :: vector' знает, как построить себя из диапазона. –

+0

Это игнорирует требование «одной строки». –

+0

@BenVoigt: Да да да ... –