¿Finalizar un flujo de entrada con un carácter específico, como '|'?
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
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 stdin
dos 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');