Как прочитать разделенные пробелом числа из консоли? - PullRequest
8 голосов
/ 31 марта 2011

Я пытаюсь выполнить простую задачу чтения разделенных пробелом чисел из консоли в vector<int>, но я не понимаю, как это сделать правильно.

Вот что я сделал до сих пор:

int n = 0;
vector<int> steps;
while(cin>>n)
{
    steps.push_back(n);
}

Однако для этого требуется, чтобы пользователь нажал недопустимый символ (например, a), чтобы разорвать цикл while. Я не хочу этого

Как только пользователь вводит числа, подобные 0 2 3 4 5, и нажимает Enter, я хочу, чтобы цикл был разорван. Я также пытался использовать istream_iterator и cin.getline, но не смог заставить его работать.

Я не знаю, сколько элементов пользователь введет, поэтому я использую vector.

Пожалуйста, предложите правильный способ сделать это.

Ответы [ 5 ]

11 голосов
/ 31 марта 2011

Используйте getline в сочетании с istringstream для извлечения чисел.

std::string input;
getline(cin, input);
std::istringstream iss(input);
int temp;
while(iss >> temp)
{
   yourvector.push_back(temp);
}
8 голосов
/ 31 марта 2011

Для уточнения ответа Йонски, есть одна возможность, предполагая, что пользователь точно вводит действительные целые числа:

string input;
getline(cin, input);

istringstream parser(input);
vector<int> numbers;

numbers.insert(numbers.begin(),
               istream_iterator<int>(parser), istream_iterator<int>());

Это будет правильно читать и анализировать действительную строку целых чисел из cin.Обратите внимание, что для этого используется функция free getline, которая работает с std::string s, а не istream::getline, которая работает со строками в стиле C.

2 голосов
/ 31 марта 2011

Кроме того, может быть полезно знать, что вы можете стимулировать EOF - Нажмите 'ctrl-z' (только для окон, в unix-подобных системах используется ctrl-d) в командной строке после того, как вы закончили вводить данные. Должно помочь вам при тестировании таких маленьких программ - без необходимости вводить недопустимый символ.

2 голосов
/ 31 марта 2011

Этот код должен вам помочь, он читает строку в строку и затем перебирает ее, получая все числа.

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string line;
    std::getline(std::cin, line);
    std::istringstream in(line, std::istringstream::in);
    int n;
    vector<int> v;
    while (in >> n) {
        v.push_back(n);
    }
    return 0;
}
1 голос
/ 31 марта 2011

Запросить пользователя после каждого номера или заранее подсчитать число и выполнить цикл соответственно.Не очень хорошая идея, но я видел это во многих приложениях.

...