Beenden eines Eingabestreams mit einem angegebenen Zeichen, z. B. '|'?

Aug 21 2020

Lerne gerade C ++, Neuling.

Ich habe ein Problem beim Beenden der Eingabe mit dem '|' Zeichen, mein Programm springt zum Ende / Ende und erlaubt keine weitere Eingabe. Ich glaube, das liegt daran, dass std :: cin aufgrund der Eingabe eines Zeichens bei der Erwartung eines int in einem Fehlerzustand ist. Deshalb habe ich versucht, std :: cin.clear () und std :: cin.ignore () zu verwenden, um das zu löschen Geben Sie den Rest des Programms aus und lassen Sie ihn laufen, aber ich kann ihn immer noch nicht knacken.

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());
        }
    }

Übergeben Sie den Vektor dann an eine Funktion, um x-mal zu durchlaufen und jedes Element zu einer Gesamtsumme hinzuzufügen. Das Programm überspringt jedoch immer die Benutzereingaben:

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;

Bitte helfen Sie!

Antworten

1 JohnnyMopp Aug 21 2020 at 01:54

Wenn die Verwendung ein "|" (oder irgendetwas, das kein ist int), die Schleife endet und die Fehlerbehandlung innerhalb der Schleife wird nicht ausgeführt. Verschieben Sie den Fehlercode einfach außerhalb der Schleife. Außerdem lesen Sie stdinzweimal, wodurch jeder andere int übersprungen wird.

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

Hinweis: Wenn Sie speziell nach "|" suchen möchten kann sich zu so etwas ändern:

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');