Question

J'ai écrit ce programme simple, aujourd'hui, mais je trouve que cin.get() refuse de travailler moins qu'il y ait deux d'entre eux. Toutes les idées?

#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 je déplace un cin.get() à avant les boucles imbriquées, les boucles, puis exécutez la pause. si je prends un cin.get() sur, le programme seulement. extrémités im en utilisant la dernière version de l'effusion de sang c ++ dev

Était-ce utile?

La solution

Vous n'êtes pas initialisez la variable « base », mais tout cela causer des bugs, il n'est pas (directement) lié au comportement que vous voyez avec cin, même si elle parfois, selon le compilateur, parce que vous pour sauter des boucles. Vous êtes probablement la construction en mode débogage que zéro Initialise ou quelque chose.

Cela dit, en supposant que a été fixé:

Lorsque vous tapez une valeur (par exemple, 5) et appuyez sur Entrée, les données dans le flux est 5<newline> - opérateur << n'extrait pas la nouvelle ligne du flux, mais cin.get () fait. Votre première cin.get () extrait de cette nouvelle ligne du flux, et le second attend d'attente pour l'entrée parce que le flux est vide maintenant. Si vous aviez seulement l'appel d'un cin.get (), il extrait immédiatement la nouvelle ligne et continuer, et comme il n'y a rien après cet appel cin.get (), le programme se termine de (comme il se doit).

Il semble que vous utilisez cin.get () pour arrêter votre programme de fermeture lorsqu'il est exécuté à partir du débogueur; vous pouvez généralement le faire via une commande spécifique « démarrer sans débogage » à partir de votre IDE; alors vous aurez pas besoin d'abuser cin.get () à cet effet.

Autres conseils

base variable n'a pas été initialisé.

Vous pouvez y remédier en donnant une valeur non valide à base comme:

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

ou

mieux utiliser un do-while comme:

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

La raison pour laquelle vous avez besoin du 2ème cin.get() est que, après avoir lu la valeur base à l'aide cin, un \n est laissé dans la mémoire tampon. Le premier appel à cin.get() consomme que \n et attend le 2e cin.get pour votre entrée. Pour éviter cela, vous devez vider le \n du tampon après cin en appelant cin.ignore

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top