Чтение нескольких целых чисел в одной строке с помощью cin в C ++ - PullRequest
1 голос
/ 12 июля 2020

У меня проблема с чтением целых чисел от пользователя. Я мог бы использовать

int a, b, c;
cin >> a >> b >> c;

Но я не знаю, сколько целых чисел введет пользователь. Я пробовал это:

    int n;
    cin >> n; //Number of numbers
    int arrayNumbers[n];

    for(int i=0;i<n;i++){
    cin>>arrayNumbers[i]
    }

И ввод пользователя будет таким: 1 2 3 Я имею в виду, в той же строке. Используя мой предыдущий код, он получает только первый номер, а не остальные.

Как я могу это сделать?

Ответы [ 2 ]

3 голосов
/ 12 июля 2020

Используйте std :: getline (), чтобы сначала прочитать всю строку в строке. Затем создайте поток строк из входной строки. Наконец, используйте istream_iterator для перебора отдельных токенов. Обратите внимание, что этот метод завершится ошибкой при первом вводе, не являющемся целым числом. Например, если использовать входы: «1 2 ab 3», тогда ваш вектор будет содержать {1,2}.

int main() {
        std::string str;
        //read whole line into str
        std::getline(std::cin, str);
        std::stringstream ss(str);
        //create a istream_iterator from the stringstream
        // Note the <int> because you want to read them
        //as integers. If you want them as strings use <std::string>
        auto start = std::istream_iterator<int>{ ss };
        //create an empty istream_iterator to denote the end
        auto end= std::istream_iterator<int>{};
        //create a vector from the range: start->end
        std::vector<int> input(start, end);
    
    }
1 голос
/ 12 июля 2020

Вместо использования статического c массива int arrayNumbers[n], который требует, чтобы вы знали, сколько чисел введет пользователь перед компиляцией, вам следует использовать массив c динамического типа, например std::vector<int>, который может изменять размер во время время выполнения.

Например:

#include <iostream> 
#include <vector>

using namespace std;

int main()
{
    vector<int> vecNumbers; // a dynamic array of integers
    while(!cin.fail())
    {
        int value;
        cout << "Enter a value: ";
        cin >> value; // don't forget the semicolon
        if(!cin.fail()) // not having this will add another 0 to the vector
            vecNumbers.push_back(value);
    }
    
    // print the final vector (can ignore for your question)
    vector<int>::const_iterator vecItr;
    cout << "\nvecNumbers = [";
    for(vecItr = vecNumbers.begin(); vecItr != vecNumbers.end(); vecItr++)
    {
        if(vecItr != vecNumbers.end()-1)
            cout << *vecItr << ", ";
        else
           cout << *vecItr << "]";
    }

    return 0;
}

Вывод:

Enter a value: 5
Enter a value: 6
Enter a value: 7
Enter a value: 8
Enter a value: s

vecNumbers = [5, 6, 7, 8] 

Обратите внимание, что !cin.fail() определяет, когда тип ввода не совпадает, и, таким образом, завершает л oop. Таким образом, у вас может быть утверждение, в котором это упоминается, например, «когда закончите, введите любой символ в конце».

Также обратите внимание, что I #include <vector> и using namespace std, если вы этого не сделаете, вы можете просто использовать std::vector<int>, std::cout и std::cin.

...