¿Finalizar un flujo de entrada con un carácter específico, como '|'?

Aug 21 2020

Actualmente aprendiendo C ++, novato.

Tengo un problema al finalizar la entrada con '|' carácter, mi programa salta al final / finaliza y no permite más entradas. Creo que es porque std :: cin está en un estado de error debido a que ingresó un char cuando esperaba un int, así que intenté usar std :: cin.clear () y std :: cin.ignore () para borrar el problema y permitir que el resto del programa se ejecute, pero todavía parece que no puedo descifrarlo, se agradece cualquier consejo.

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

Y luego pasar el vector a una función para iterar x cantidad de veces y agregar cada elemento a un total, pero el programa siempre pasa por alto la entrada del usuario:

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;

¡Por favor ayuda!

Respuestas

1 JohnnyMopp Aug 21 2020 at 01:54

Cuando el uso ingresa un "|" (o cualquier cosa que no sea un int), el ciclo termina y el manejo de errores que está dentro del ciclo no se ejecuta. Simplemente mueva el código de error fuera del ciclo. Además, lee stdindos veces, lo que se saltará todos los demás int.

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

Nota: Si desea verificar específicamente "|" puede cambiar a algo como esto:

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