Как перестать принимать произвольное количество входов? - PullRequest
0 голосов
/ 02 мая 2020

У меня нет определенного c количества входов. Сумма может быть любой. Поэтому я должен использовать это l oop. Но как мне прекратить принимать ввод, как только я закончу?

#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
vector<int>v;

Использование этого l oop для ввода входов, потому что я не знаю количество входов. Но как мне остановить l oop, как только я закончу вводить данные?

while(cin){
cin >> n;
v.push_back(n);

}

}

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Зависит от того, какую форму вы ожидаете получить. Если ожидаемый ввод представляет собой список чисел, разделенных пробелом, в одной строке:

>>>1 2 3 4 5 6

, это довольно легко решить:

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

int main(){
    std::vector<int> v; //default construct int vector

    //read in line of input into "buffer" string variable
    std::string buffer;
    std::getline(std::cin, buffer);

    //stream line of input into a stringstream
    std::stringstream ss;
    ss << buffer;

    //push space-delimited ints into vector
    int n;
    while(ss >> n){
        v.push_back(n);
    }     

    //do stuff with v here (presumably)

    return 0;
}

Если, однако, ожидаемый ввод список чисел, разделенный новой строкой:

>>>1
2
3
4
5
6

Вам нужно будет выбрать условие выхода, которое сообщит программе, когда прекратить принимать входные данные. Это может принять форму слова, которое скажет программе остановиться. Например:

>>>1
2
3
4
5
6
STOP

Программа, которая будет работать с таким входом:

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

int main(){
    std::vector<int> v; //default construct int vector

    const std::string exitPhrase = "STOP"; //initialise exit phrase   

    //read in input into "buffer" string variable. If most recent input
    //    matches the exit phrase, break out of loop
    std::string buffer;
    while(std::cin >> buffer){
        if(buffer == exitPhrase) break; //check if exit phrase matches

        //otherwise convert input into int and push into vector
        std::stringstream ss;
        ss << buffer;
        int n;
        ss >> n;
        v.push_back(n);
    }

    //do stuff with v here (again, presumably)

    return 0;

}

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

0 голосов
/ 02 мая 2020

Я полагаю, что это не столько проблема с самим кодом, сколько проблема с форматированием ввода. Вы можете поместить весь свой ввод в текстовый файл и передать его в качестве аргумента исполняемому файлу в командном терминале следующим образом: executable_name < file_name. Кроме того, с помощью небольшого рефакторинга вы можете переформатировать ваше время l oop следующим образом:

while(cin >> n){
    v.push_back(n);
}

Теперь, когда l oop, теперь вы можете поместить по своему выбору escape-символ в конце вашего входной файл, чтобы при обнаружении нечислового символа c время l oop разрывалось.

...