Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11

Discussione: [c++] problemi con cin

  1. #1

    [c++] problemi con cin

    Salve,

    Sono un programmatore in erba...e ho riscontrato un problema quando cerco di prelevare dalla tastiera un numero e invece inserisco una lettera ad esempio

    [...]
    int scelta = 0; //definisco e dò valore alla variabile scelta
    do{//open do
    //uso un solo cout per ordine personale

    cout << "1 - continua" << endl
    << "2 - esci" << endl << endl
    << "Scegli > ";

    //prelevo il valore dalla tastiera
    cin >> scelta;
    }//close do
    while( scelta < 1 && scelta > 2);
    [...]
    Se ad esempio io inserisco il carattere "p" invece di un numero mi ripete all'infinito il ciclo do...Come posso risolvere???

    Scusate ancora se per voi è un bug semplicissimo ma io stò ancora studiando il c++

    Grazie

    P.S è meglio che usi vc++ express 2008 o che installi la beta di vs 2010???

    Grazieeeeeeeeeeeee ancora!!!!!

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non è un bug, anche se appare come tale. Semplicemente il cin va in errore.
    Si può risolvere così:
    codice:
            #include <limits> // per numeric_limits<std::streamsize>::max()
    	int scelta = 0; //definisco e dò valore alla variabile scelta
    	do{//open do
    		//uso un solo cout per ordine personale
    		cout << "1 - continua" << endl
    		<< "2 - esci" << endl << endl
    		<< "Scegli > ";
    		//prelevo il valore dalla tastiera
    		cin >> scelta;
    		if (!cin) {
    			cin.clear(); // toglie l'errore
    			cin.ignore(numeric_limits<std::streamsize>::max(), '\n'); // ripristina cin
    		}
    	}//close do
    	while( scelta < 1 && scelta > 2);
    P.S
    Io consiglio di lasciar perdere le beta per il momento.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it L'avatar di Mad_al
    Registrato dal
    Jun 2009
    Messaggi
    125
    più facilmente con il getline e cin di stringa

    getline (cin,scelta);

    e poi fare il controllo if (scelta == '1')
    else.... e così via

  4. #4
    Utente di HTML.it L'avatar di Zahami
    Registrato dal
    May 2009
    Messaggi
    59
    Io ho copiato, incollato, compilato ed eseguito il tuo programma così come lo hai postato (però ovviamente ho dovuto aggiungere la funzione main) e anche se digito un carattere il ciclo termina...anzi, anche digitando 1 o 2 il ciclo termina!
    Secondo me hai sbagliato a specificare la condizione del do-while.
    La tua riga è questa:
    codice:
    while( scelta < 1 && scelta > 2);
    Ma facendo così praticamente la condizione è falsa ogni volta che premi qualsiasi cosa, questo perché stai dicendo di continuare solo se scelta è minore di 1 e maggiore di 2...ma pensaci...esiste un numero che allo stesso tempo è minore di 1 e maggiore di 2 ?!?!?
    Sei sicuro di aver postato il codice correttamente?
    In questo caso la linea di codice giusta potrebbe essere:
    codice:
    while(scelta == 1);
    In questo modo il ciclo continua SOLO se scrivi 1 (che appunto come dici tramite il comando cout dovrebbe servire per continuare).
    Per quanto riguarda il fatto di mettere una lettera, usando il mio codice succede che il programma si ferma immediatamente perché la variabile scelta è di tipo int e inserendo un carattere va in errore, non ci puoi fare niente...e poi una domanda: ma perché devi inserire una lettera???


    P.S è meglio che usi vc++ express 2008 o che installi la beta di vs 2010???
    Se usi Windows ti consiglio DevC++, io ora uso Linux e quando ero su Windows usavo quello, per me è ottimo!

    PS: Se ho detto un mucchio di cavolate, scusatemi! Io per ora programmo in C, non so quasi niente di C++, ho risposto ragionando per logica!
    Zahami

  5. #5
    Originariamente inviato da shodan
    Non è un bug, anche se appare come tale. Semplicemente il cin va in errore.
    Si può risolvere così:
    Per evitare di incasinare tutti i cicli del genere con la logica di gestione degli errori di solito uso questa funzione:
    codice:
    #include <limits>
    #include <cmath>
    
    //...
    
    template<class inType> void AcquireInput(ostream & Os, istream & Is, const string & Prompt, inType & Result)
    {
        do
        {
            Os<<Prompt.c_str();
            if(Is.fail())
            {
                Is.clear();
                Is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            }
            Is>>Result;
        } while(Is.fail());
    }
    
    template<class inType> inType AcquireInput(ostream & Os, istream & Is, const string & Prompt)
    {
        inType temp;
        AcquireInput(Os,Is,Prompt,temp);
        return temp;
    }
    Utilizzo del primo overload:
    codice:
    int intero;
    AcquireInput(cout,cin,"Inserisci un numero intero: ",intero);
    Utilizzo del secondo overload:
    codice:
    int intero=AcquireInput(cout,cin,"Inserisci un numero intero: ");
    ; il vantaggio del primo overload è che evita di costruire oggetti temporanei (il che potrebbe non essere desiderabile in alcuni casi), ma il secondo è molto più comodo in diverse occasioni.
    Originariamente inviato da Zahami
    Se usi Windows ti consiglio DevC++, io ora uso Linux e quando ero su Windows usavo quello, per me è ottimo!
    'nzomma... è vecchio, non viene più mantenuto e ha diversi bug. Su Windows uno degli IDE migliori è Visual C++, non è male anche Code::Blocks (sicuramente meglio di Dev-C++).
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Ho capito.....grazie a tutti


    Zahami dai una bella ripassata al c/c++ o php
    Io ho copiato, incollato, compilato ed eseguito il tuo programma così come lo hai postato (però ovviamente ho dovuto aggiungere la funzione main) e anche se digito un carattere il ciclo termina...anzi, anche digitando 1 o 2 il ciclo termina!
    Secondo me hai sbagliato a specificare la condizione del do-while.
    La tua riga è questa:
    codice:
    while( scelta < 1 && scelta > 2);
    Ma facendo così praticamente la condizione è falsa ogni volta che premi qualsiasi cosa, questo perché stai dicendo di continuare solo se scelta è minore di 1 e maggiore di 2...ma pensaci...esiste un numero che allo stesso tempo è minore di 1 e maggiore di 2 ?!?!?
    Sei sicuro di aver postato il codice correttamente?
    In questo caso la linea di codice giusta potrebbe essere:
    codice:
    While( scelta == 1)
    1)Questo ciclo è stato preso inmezzo al codice sorgente...se noti a em serve solo per far fare una scelta e con la scelta tramite if()elseif etc facevo fare determinate azioni al programma.
    2)
    Lezioncina sugli operatori logici:

    &&: indica che una delle due condizione deve essere true...se questo evento si verifica la condizione ritorna true...e nel nostro caso se ritorna ture vuol dire che hai scelto una cosa sbagliata

    ||: indica che tutte e due le condizioni devono essere vere per ritornare true

    !: negazione ad esempio se tu scrivi varibile_esempio != 1 vai a negare appunto l'uguale e si trascrive letteralmente così la varibile_esempio è DIVERSA da 1(Naturalemnte sta cosa andrebbe in un if)

    3)Certo che è sempre falso...il do while funziona così: nel ciclo do c'è il codice...e questo codice si continua a ripetere finche la condizione nel while risulta falsa.
    Quindi nel mio caso il ciclo termina solo se la scelta dell'utente è diversa da quella da me richiesta, cioè se i valori immesi non sono più bassi di 1(c'è lo 0 prima dell'1) o più grandi di 2
    Per quanto riguarda il fatto di mettere una lettera, usando il mio codice succede che il programma si ferma immediatamente perché la variabile scelta è di tipo int e inserendo un carattere va in errore, non ci puoi fare niente...e poi una domanda: ma perché devi inserire una lettera???
    Bè capita che a volte l'utente o tu stesso nel andarea premere invio schiacci sbadatamente una lettera no...ed era li il mio problema :rollo: .
    La prossima volta se non sai le cosa fai senza postare che intasi solamente il post per nulla u.u(Mi scuso per la durezza ma quando ci vuole ci vuole)


    P.S già che ci sono vi faccio una domanda che sò che è già stata tratta in altri post(vecchissimi)mi potreste consigliare qualche manuale cartaceo in italiano che tratta il C++ dal semplice

    #include

    Alla libreria windows.h e così discorrendo???
    non Guardate il prezzo...basta che sia in italiano e abbastanza recente.

    Grazie ancora

  7. #7
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    windows.h è un header non una libreria

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Multanova
    Lezioncina sugli operatori logici:

    &&: indica che una delle due condizione deve essere true...se questo evento si verifica la condizione ritorna true...e nel nostro caso se ritorna ture vuol dire che hai scelto una cosa sbagliata

    ||: indica che tutte e due le condizioni devono essere vere per ritornare true
    Esattamente il contrario di quello che hai detto.

    &&: AND logico. L'espressione è vera se e solo se entrambi gli operandi sono veri.

    ||: OR logico. L'espressione è vera se almeno uno dei due operandi è vero.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da Multanova
    Lezioncina sugli operatori logici:

    &&: indica che una delle due condizione deve essere true...se questo evento si verifica la condizione ritorna true...e nel nostro caso se ritorna ture vuol dire che hai scelto una cosa sbagliata

    ||: indica che tutte e due le condizioni devono essere vere per ritornare true
    Lezioncina sulle lezioncine ... evitiamo di scriverne se non sono corrette ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Esattamente il contrario di quello che hai detto.

    &&: AND logico. L'espressione è vera se e solo se entrambi gli operandi sono veri.

    ||: OR logico. L'espressione è vera se almeno uno dei due operandi è vero.


    Ciao.
    Optz avete ragione.... ammetto di aver sbagliato...mi confondo sempre tra && e || e sarebbe da stupidi dire era tardi ed ero rintronato , comuque a parte che gli ho invertiti quello che ho scritto è giusto no...sono sempre ammessi suggerimenti perchè sono alle prime armi e sicuramente non mi paragono nemmeno lontanamente a voi che magari vi siete fatti la laurea su queste cose.

    Mi sapete conisgliare un libro/manuale sul c++ recente che spiega il c++ dalla a alla z?????

    Grazie e scusate ancora la confusione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.