Domanda

Ho scritto questo semplice programma di oggi, ma ho trovato che cin.get() rifiuta di lavoro a meno che non ci sono 2 di loro. Tutte le idee?

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

Se sposto un cin.get() a prima del cicli annidati, i loop corrono allora pausa. Se prendo uno cin.get() fuori, il programma solo le estremità. im utilizzando l'ultima versione di C ++ sangue dev

È stato utile?

Soluzione

Non sei l'inizializzazione della variabile 'base', ma mentre che causerà bug non lo è (direttamente) in relazione al comportamento si sta vedendo con cin, anche se a volte, a seconda del compilatore, la causa si saltare loop. Probabilmente stai costruendo in modalità debug che zero inizializza o qualcosa del genere.

Detto questo, partendo dal presupposto che è stato fissato:

Quando si digita un valore (ad esempio, 5) e premere Invio, i dati nel flusso è 5<newline> - operatore << non estrae il ritorno a capo dal flusso, ma cin.get () fa. Il tuo primo cin.get () estrae che newline dal flusso, e il secondo di attesa di attesa per l'ingresso, perché il flusso è ora vuota. Se solo si avesse la chiamata uno cin.get (), sarebbe estrarre il ritorno a capo immediatamente e continuare, e dal momento che non v'è nulla dopo che cin.get () chiamata, le termina programma (come dovrebbe).

Sembra che si sta utilizzando cin.get () per interrompere il programma di chiudere quando eseguito dal debugger; di solito si può fare questo tramite uno specifico "Avvia senza eseguire debug" comando dal vostro IDE; quindi non sarà necessario abusare cin.get () per questo scopo.

Altri suggerimenti

base variabile non è stata inizializzata.

Si può risolvere il problema dando un valore non valido per base come:

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

o

meglio usare un ciclo Do-While come:

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

Il motivo per cui è necessario il secondo cin.get() è che, dopo aver letto il valore base utilizzando cin, un \n viene lasciato nel buffer. La prima chiamata a cin.get() consuma che \n e il 2 ° attese cin.get per il vostro input. Per evitare questo è necessario lavare il \n dal buffer dopo cin chiamando cin.ignore

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top