Pregunta

Me escribió este sencillo programa de hoy, pero he encontrado que cin.get() se niega a trabajar a menos hay 2 de ellos. Algunas ideas?

#include <iostream>
using namespace std;

int main(){
    int base;
    while ((base < 2) || (base > 36)){
          cout << "Base (2-36):" << endl; 
          cin >> base;
          }
    string base_str = "0123456789abcdefghijklmnopqrstuvwxyz";
    for (int i = 0; i < base; i++){
        for (int j = 0; j < base; j++){
            for (int k = 0; k < base; k++){    
                cout << base_str[i] << base_str[j] << base_str[k] << endl;
            }
        }
    }
    cin.get();
    cin.get();
}

Si muevo un cin.get() a antes de que los bucles anidados, los bucles corren entonces pausa. Si tomo una cin.get() a cabo, el programa sólo extremos. im utilizando la última versión de C ++ derramamiento de sangre dev

¿Fue útil?

Solución

No está inicializando la variable 'base', pero al mismo tiempo que hará que los insectos no lo es (directamente) relacionados con el comportamiento que se está viendo con cin, a pesar de que a veces, dependiendo del compilador, que causa para saltar bucles. Probablemente se esté construyendo en el modo de depuración que cero a inicializar o algo así.

Dicho esto, suponiendo que se fijó:

Cuando se escribe un valor (por ejemplo, 5) y pulsa enter, los datos en la corriente es 5<newline> - operador << no extrae la nueva línea de la corriente, pero cin.get () lo hace. Su primera cin.get () extrae que la nueva línea de la corriente, y el segundo espera esperar a la entrada ya la corriente está vacía. Si usted tenía sólo la llamada uno cin.get (), sería extraer el salto de línea inmediatamente y continuar, y puesto que no hay nada después de esa llamada cin.get (), de la expiración de los programas (como debería).

Parece que estás usando cin.get () para detener su programa se cierre cuando se ejecuta desde el depurador; por lo general puede hacerlo a través de una específica "Iniciar sin depurar" comando desde el IDE; entonces usted no tendrá que abusar cin.get () para este propósito.

Otros consejos

base variable no se ha inicializado.

Se puede solucionarlo dando un valor no válido para base como:

int base = 1; // 1 is not in the valid range.
while ((base < 2) || (base > 36)){

o

utilizar mejor un do-while como:

int base;
do{
     cout << "Base (2-36):" << endl;
     cin >> base;
} while ((base < 2) || (base > 36));

La razón por la que necesita la segunda cin.get() es que, después de leer el valor base usando cin, un \n se deja en la memoria intermedia. La primera llamada a cin.get() consume que \n y el 2º espera cin.get para su entrada. Para evitar esto es necesario para limpiar el \n de la memoria intermedia después cin llamando cin.ignore

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top