while que loop for c++ c++11 while-loop codeblocks

c++ - que - while loop java



While-loop se rompe, y no sé la razón por la cual (2)

Estaba escribiendo un código para un contador. Si doy ''a'' como entrada, debe +1 al contador y mostrarlo en la pantalla. Pero cuando lo hago, muestra 1 en la pantalla y el programa finaliza. Quiero que se ejecute hasta y a menos que le dé otro carácter como entrada. ¿Cuál es el error que estoy cometiendo?

#include <iostream> #include <stdlib.h> using namespace std; int main() { int Counter = 0; char t; while(true) { t = cin.get(); if(t == 97) { Counter = Counter + 1; } else break; system("cls"); cout << Counter; } return 0; }


El problema es cuando ingresas tu ''a'' , probablemente también estés presionando Enter , que se interpreta como otro char . Esa segunda char definitivamente no es a , entonces tu programa se rompe. Esto se puede verificar publicando lo que lees:

for (;;) { std::cout << ''?''; char t = std::cin.get(); std::cout << (int)t << ''/n''; if (t != ''a'') break; } std::cout << "done/n";

Que, cuando se ejecuta, imprime:

?a 97 // this is ''a'' ?10 // this is ''/n'', note the additional ? done

La solución más simple sería usar el operador de flujo de entrada en cin , que descartaría el espacio en blanco en la entrada (mientras que get() no lo hace):

char t; for (;;) { std::cout << ''?''; std::cin >> t; std::cout << (int)t << ''/n''; if (t != ''a'') break; } std::cout << "done/n";

Que, cuando se ejecuta, produce:

?a 97 ?b 98 done

que es lo que pretendías


Prueba esto:

#include <iostream> #include <stdlib.h> using namespace std; int main() { int Counter = 0; char t; while(true) { t = cin.get(); if(t == 97) { Counter = Counter + 1; } // else // break; system("cls"); cout << Counter; } //system("pause"); return 0; }

Tu else break; es la razón por la que estás cerrando después de cualquier interacción. Básicamente después de cualquier iteración, se romperá debido a cualquier entrada que no sea. Sin embargo, al ejecutar el código anterior, verá el incremento del contador en cada entrada dada y no se romperá.

Esto le dará la operación básica que está buscando, que es incrementar el contador en función de la entrada a, de lo contrario, no haga nada.

Editar: El código anterior almacenará en búfer tu entrada y la leerá todo, así que si tienes 5 a ''s como la siguiente aaaaa , la leerá y sacará 5 para el contador.

Si quiere salir del círculo, le sugiero esto:

#include <iostream> #include <stdlib.h> using namespace std; int main() { int Counter = 0; char t; while(true) { cin >> t; // t = cin.get(); if(t == 97) { Counter = Counter + 1; } else break; system("cls"); cout << Counter; } //system("pause"); return 0; }

Lo probé y funciona. Parece estar relacionado con cómo cin.get() lee la entrada almacenada en búfer desde la consola (creo). No estoy seguro sobre los detalles, pero cin >> t hace el truco.

Edición 2: cin.get() poco y creo que cin.get() consumirá el siguiente carácter después de tu entrada, pero en este caso es un espacio de noticias /n , por lo que siempre se romperá en tu código original.