[c++]Istruzione cin all'interno del while non eseguita

di il
9 risposte

[c++]Istruzione cin all'interno del while non eseguita

Salve, ho un problema con il codice che vi ho incollato. Non capisco perchè se l'utente, per errore, inserisce un carattere, il programma entra nel while e si ripete in loop senza eseguire la cin. Se anche mettessi una cin, dichiarando una seconda variabile, il ciclo non si ferma in attesa dell'inserimento del valore ma si ripete in loop, come se non vedesse più le istruzioni di cin. Cosa sbaglio?

#include <iostream>
using namespace std;
int main (void)
{
    int d;
    cout<<"Inserisci un numero compreso tra 1 e 100"<<endl;
    cin>>d;
    cout << d << endl;
        while(d<1||d>100)
        {
            cout<<"il valore inserito è errato, riprova"<<endl;
            cin>>d; //con i caratteri non viene eseguita questa istruzione
        }
}

Grazie mille per l'aiuto.

9 Risposte

  • Re: [c++]Istruzione cin all'interno del while non eseguita

    Devi gestire l'errore
    
    #include <iostream>
    #include <limits>
    using namespace std;
    int main (void){
        int d;
        cout<<"Inserisci un numero compreso tra 1 e 100"<<endl;
        cin>>d;
        while(cin.fail()||d<1||d>100){
                cin.clear();
                cin.ignore(numeric_limits<streamsize>::max(), '\n');        
                cout<<"il valore inserito e' errato, riprova"<<endl;
                cin>>d;
        }    
    }
    
  • Re: [c++]Istruzione cin all'interno del while non eseguita

    Grazie mille, in questo modo funziona. Vorrei capire perchè si comporta così. Per quale motivo senza la gestione dell'errore non funzionava? Se nel ciclo entrava, perchè la cin non veniva eseguita? Se provavo a stampare il contenuto della cin, visualizzavo in output il valore 0. Non poteva essere considerato semplicemente come un numero e quindi eseguire la cin, visto che il resto del codice lo eseguiva correttamente?
  • Re: [c++]Istruzione cin all'interno del while non eseguita

    Riflettici. Lasciando perdere i programmini scolastici, secondo te sarebbe buona progettazione pulire in automatico i buffer al primo errore?
  • Re: [c++]Istruzione cin all'interno del while non eseguita

    Weierstrass ha scritto:


    Riflettici. Lasciando perdere i programmini scolastici, secondo te sarebbe buona progettazione pulire in automatico i buffer al primo errore?
    Immagino di no, ma a livello di memoria cosa succede? Quando la variabile intera riceve un char cosa memorizza?
  • Re: [c++]Istruzione cin all'interno del while non eseguita

    Spizzolo ha scritto:


    Grazie mille, in questo modo funziona. Vorrei capire perchè si comporta così. Per quale motivo senza la gestione dell'errore non funzionava? Se nel ciclo entrava, perchè la cin non veniva eseguita? Se provavo a stampare il contenuto della cin, visualizzavo in output il valore 0. Non poteva essere considerato semplicemente come un numero e quindi eseguire la cin, visto che il resto del codice lo eseguiva correttamente?
    Perché non è così che funziona. Se inserisci un carattere qualsiasi quando cin si aspetta valori numerici questo smette di funzionare finché non si riporta il suo stato da failbit a goodbit
  • Re: [c++]Istruzione cin all'interno del while non eseguita

    Spizzolo ha scritto:


    Weierstrass ha scritto:


    Riflettici. Lasciando perdere i programmini scolastici, secondo te sarebbe buona progettazione pulire in automatico i buffer al primo errore?
    Immagino di no, ma a livello di memoria cosa succede? Quando la variabile intera riceve un char cosa memorizza?
    Non è questione di memoria. L’oggetto cin deve leggere dal buffer un numero scritto come sequenza di caratteri, convertirlo in intero e assegnarlo alla variabile. Se gli dai un carattere non sa come comportarsi.
  • Re: [c++]Istruzione cin all'interno del while non eseguita

    Adesso comincia ad essere più chiaro. Mi mancava la parte del buffer.
    Ho però ancora un dubbio che mi è sorto leggendo la documentazione e allora ho fatto dei tentativi modificando il codice in questo modo:
    
    #include <iostream>
    #include <limits>
    using namespace std;
    int main (void){
        int d;
        cout<<"Inserisci un numero compreso tra 1 e 100"<<endl;
        cin>>d;
        while(cin.fail()||d<1||d>100){
                cin.clear();
                cin.ignore(' ', '\n');
                cout<<"il valore inserito e' errato, riprova"<<endl;
                cin>>d;
        }
    }
    
    Non avendo ben capito a cosa servisse numeric_limits<streamsize>::max(), l'ho sostituita con ' ' e funziona ugualmente. Mi sapete spiegare il perchè?
  • Re: [c++]Istruzione cin all'interno del while non eseguita

    Spazio è 32 in ASCII, quindi estrai 32 caratteri dal buffer oppure fermati al newline (che c'è per forza perché l'utente preme invio)
  • Re: [c++]Istruzione cin all'interno del while non eseguita

    Chiarissimo, grazie mille per le risposte.
Devi accedere o registrarti per scrivere nel forum
9 risposte