Как читать с клавиатуры переменное число целых чисел в C ++? - PullRequest
0 голосов
/ 06 декабря 2018

Мне нужно прочитать переменное число целых чисел с клавиатуры, чтобы я мог использовать каждое из них.

Сначала я подумал, что могу использовать что-то вроде

    int myinteger;
    for (int i=0; i<MAX_NUMBER_OF_INTEGERS; i++){
    cin >> myinteger;
    //What I want to do with that Integer
    }

Но потом я понял,что если MAX_NUMBERS_OF_INTEGERS = 10, я должен написать 10 целых чисел.Но я хочу, чтобы я мог передать «1 2 3» «1 2 3 4» (например) и не обязательно писать 10 целых чисел.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Один из способов прочитать все числа из одной строки, ограничив их максимальным числом целых чисел, - это использовать std :: getline (), чтобы получить строку в строку, а затем использовать istringstream в цикле.

#include <iostream>
#include <sstream>
using namespace std;

int main() {
    std::string line; 
    std::getline (std::cin,line); 
    std::istringstream iss(line);

    int myInt;

    for(int i=0;(iss >> myInt) && (i < MAX_NUMBER_OF_INTEGERS);++i ) {
        std::cout << myInt << ' ';
    }

    return 0;
}

Примечание: я не определил MAX_NUMBER_OF_INTEGERS в коде.Я мог бы определить его с помощью const int MAX_NUMBERS_OF_INTEGERS = 10; перед использованием или, возможно, это может быть определение препроцессора или даже параметр командной строки.Я оставляю это на усмотрение пользователя.

0 голосов
/ 06 декабря 2018

Вопрос, кажется, немного изменился, так как он был задан, и был дан хороший ответ.Это просто служит для ответа на новые вопросы.

#include <iostream>
#include <sstream>
#include <vector>

const int MAX_NUMBERS_OF_INTEGERS = 10;

int main() {
    std::string line;
    std::cout << "Enter at most " << MAX_NUMBERS_OF_INTEGERS << " ints, separated by spaces: ";
    std::getline(std::cin, line);

    // create a string stream of the line you entered
    std::stringstream ss(line);

    // create a container for storing the ints
    std::vector<int> myInts;

    // a temporary to extract ints from the string stream
    int myInteger;

    // extract at most MAX_NUMBERS_OF_INTEGERS ints from the string stream
    // and store them in the container
    while(myInts.size()<MAX_NUMBERS_OF_INTEGERS && ss>>myInteger) myInts.push_back(myInteger);

    std::cout << "Extracted " << myInts.size() << " integer(s)\n";

    // loop through the container and print all extracted ints.
    for(int i : myInts) {
        std::cout << i << "\n";
    }
    // ... or access a certain int by index
    if(myInts.size() > 2)
        std::cout << "The third int was: " << myInts[2] << "\n";

}
0 голосов
/ 06 декабря 2018
std::vector<int> read_ints;
int _temp;
for(;;)
{        
    cin >>_temp;
    if(!cin.good()) {
        break;
    }
    else {
        read_ints.push_back(_temp);
    }
}

Я не тестировал это решение, но оно должно считывать произвольное количество целых чисел из cin до тех пор, пока вы не введете что-то кроме целого числа.Вы также можете пропустить сохранение в векторной части, если вам не нужно сохранять результаты.Это просто замечательно, если вы хотите сохранить произвольное число целых чисел.

РЕДАКТИРОВАТЬ: После разъяснения ваше решение может выглядеть следующим образом:

 int MAX_CHARS = 10;
 int my_int;
 cin >> setw(MAX_CHARS) >> my_int;

setw ограничивает количество вводимых символов, но выдолжен включать заголовок iomanip

Если вы хотите получить доступ к каждой цифре, преобразуйте int в вектор целых с помощью этой функции:

vector <int> integerToArray(int x)
{
    vector <int> resultArray;
    while (true)
    {
        resultArray.insert(resultArray.begin(), x%10);
        x /= 10;
        if(x == 0)
            return resultArray;
    }
 }

, тогда вы можете получить доступ к каждой цифре с помощью индекса, например, первой цифры

 vectory<int> resultArray = integerToArray(my_int);
 int digit = resultArray[0];

Источник

...