Terminare un flusso di input con un carattere specificato, ad esempio "|"?

Aug 21 2020

Attualmente sto imparando C ++, principiante.

Ho un problema quando si termina l'input con "|" carattere, il mio programma salta alla fine / termina e non consente ulteriori input. Credo che sia perché std :: cin è in uno stato di errore a causa dell'inserimento di un carattere quando ci si aspetta un int, quindi ho provato a usare std :: cin.clear () e std :: cin.ignore () per cancellare il problema e consentire l'esecuzione del resto del programma ma non riesco ancora a risolverlo, qualsiasi consiglio è apprezzato.

int main()
{
    std::vector<int> numbers{};
    int input{};
    char endWith{ '|' };

    std::cout << "please enter some integers and press " << endWith << " to stop!\n";
    while (std::cin >> input)
    {
        if (std::cin >> input)
        {
            numbers.push_back(input);
        }
        else
        {
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max());
        }
    }

E poi passa il vettore a una funzione per iterare attraverso x quantità di volte e aggiungere ogni elemento a un totale, ma il programma salta sempre oltre l'input dell'utente:

std::cout << "Enter the amount of integers you want to sum!\n";
    int x{};
    int total{};
    std::cin >> x;


    for (int i{ 0 }; i < x; ++i)
    {
        total += print[i];
    }

    std::cout << "The total of the first " << x << " numbers is " << total;

Per favore aiuto!

Risposte

1 JohnnyMopp Aug 21 2020 at 01:54

Quando l'uso entra in un "|" (o qualsiasi cosa che non sia an int), il ciclo termina e la gestione degli errori che si trova all'interno del ciclo non viene eseguita. Basta spostare il codice di errore all'esterno del ciclo. Inoltre, leggi da stdindue volte che salterà ogni altro int.

while (std::cin >> input) {
    numbers.push_back(input);
}
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Nota: se desideri controllare specificamente "|" può cambiare in qualcosa di simile:

while (true) {
    if (std::cin >> input) {
        numbers.push_back(input);
    }
    else {
        // Clear error state
        std::cin.clear();
        char c;
        // Read single char
        std::cin >> c;
        if (c == '|') break;
        // else what to do if it is not an int or "|"??
    }
}
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');