Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41

    [C++]controllo tipo acquisizione

    devo acquisire un intero dall'utente. Per assicurarmi che fosse intero ho pensato di dichiararlo float e poi are un controllo sulla parte intera del numero inserito dall'utente. Se però inserisce un carattere non so bene cosa fare. Ho spulciato la reference ma mi sono perso nella miriade di funzioni, qualcuno mi può dare un suggerimento? faccio un controllo sul type?

    codice:
     do{       cout << "inserire dimensione del sistema (<100): ";
           cin >> n;
           if((n>100)||(((int)n-n)!=0)){
                                        cout << "\nnumero non valido\n\n";
                                        aux=0;
                                        }
           else{
                aux=1;
                }
           } while(aux==0);

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Acquisisci una stringa invece di un float e usa atoi (principalmente per evitare una eccezione)
    codice:
    #include <string>
    ...
    string line;
    do {
        getline(cin,line);
        aux = atoi(line.c_str());
    } while (aux ==0);
    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
    Registrato dal
    Jan 2011
    Messaggi
    41
    grazie mille, stavo proprio studiando una soluzione con atoi ma mi mancava il resto. Grazie ancora

    -----

    in realtà così escludo i caratteri, ma in ogni caso se inserisco un decimale mi perdo la possibilità di controllarlo pochè atoi mi da cmq la parte intera...ho inserito un opzione di verifica con y/n per accettare o reinserire il dato ma non mi piace un granchè....cmq funziona e questo è l'importante.
    Ultima modifica di Toxotes; 29-10-2013 a 01:07

  4. #4
    codice:
    #include <string>
    #include <sstream>
    ...
    string line;
    istringstream is;
    do {
        getline(cin,line);
        is.clear()
        is.str(line)
        is>>aux>>std::ws;
    } while (!is && !is.eof());
    Legge l'intera riga in uno string stream, prova a leggere l'intero ed eventuale whitespace; ripete all'infinito se trova un errore nella lettura dell'intero o se leggendo l'intero e il whitespace non arriva a fine riga (=ci sono dei caratteri estranei in fondo).
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    Scusate ma non riesco bene a capire, prob. devo studiare un pò di + ma....con atoi ok, prende la parte intera e vabbuò. Nel tuo caso MItaly non ho chiaro dove storare la variabile inserita, nè ho chiaro come fa a capire se il numero inserito è un decimale e quindi a rigettarlo. Cioè entrambi mi rigettano un carattere, ma non un numero decimale. (nel secondo caso non ho nemmeno capito come assegnare il valore passato da cin alla variabile n). In ogni caso non deve essere così user friendly e quindi vabbè, ai fini pratici non importa, era un'occasione per imparare qualcosa.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    Ok ho studiato un pochino (non avevo ben chiaro che sstram passasse la string in una variabile numerica come int o float. Così il codice esegue quello che cercavo, grazie MItaly. Ho messo dei commenti perchè no sono sicuro di aver capito il processo, puoi verificare quando hai tempo grazie?

    codice:
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <sstream>
    
    
    using namespace std;
    
    
    int main(){
        
        //controllo dim n
        string s;
        istringstream is;
        float n;
        
        do{
              do{
        cout << "inserire la dimensione n del sistema, n<100: ";
        //assegna il contenuto di cin a s (intera riga)
        getline(cin, s);
        //azzera eventuali errori precedenti
        is.clear();
        //mette s nello sstream
        is.str(s);
        //ecco qui mi perdo un attimo, lo stream assegna s ad n? e il whitespace?
        is >> n >> std::ws;
        //potevo are un do whle unico ma li ho divisi per maggior chiarezza (mia s'intende)
        }while(!is && !is.eof());
        }while((((int)n-n)!=0) || (n>100));
        return 0;
    }
    curiosità, se inserisco un intero seguito da 2 punti e qualsiasi altra cosa lo prende, sapete come mai?
    Ultima modifica di Toxotes; 29-10-2013 a 23:16

  7. #7
    //ecco qui mi perdo un attimo, lo stream assegna s ad n? e il whitespace?
    Lo stream prova ad estrarre da s un intero, e quindi legge e scarta tutto il whitespace che trova in fondo. Questo fa sì che la stringa venga consumata completamente anche se dopo il numero ci sono degli spazi (se ci sono prima non importa, visto che sono già scartati automaticamente). Ci interessa arrivare in fondo alla stringa anche in questo caso perché poi facciamo il controllo su eof(), che a noi interessa solo se i caratteri che sono avanzati nello stream sono non-whitespace.
    curiosità, se inserisco un intero seguito da 2 punti e qualsiasi altra cosa lo prende, sapete come mai?
    Uhm, non dovrebbe...
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    Ok thx.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.