Newsgroup: it.comp.lang.c++
Titolo: Controllo input numerico e funzione cin.ignore()

 
Il seguente codice, esegue un controllo sul valore numerico inserito:
 
http://www.learncpp.com/cpp-tutorial/135-stream-states-and-input-validation/
 
 
===============================================
 
int main()
{
    int nAge;
 
    while (1)
    {
        cout << "Enter your age: ";
        cin >> nAge;
 
        if (cin.fail()) // no extraction took place
        {
            cin.clear(); // reset the state bits back to goodbit so we
can use ignore()
            cin.ignore(1000, '\n'); // clear out the bad input from
the stream
            continue; // try again
        }
 
        cin.ignore(1000, '\n'); // clear out any additional input from
the stream
 
        //*Quale istruzione inserire in questo punto per stampare il
contenuto di cin?*
 
        if (cin.gcount() > 1) // if we cleared out more than one
additional character
            continue; // we'll consider this input to be invalid
 
        if (nAge <= 0) // make sure nAge is positive
            continue;
 
    break;
    }
 
    cout << "You entered: " << nAge << endl;
}
 
=================================================
 
 
Quando inserisco un'input del tipo : 123abc , l'istruzione :
 
 if (cin.gcount() > 1) ....sara' vera,  in quanto, *se ho ben capito*,
dopo l'istruzione:
 
  cin.ignore(1000, '\n'); // clear out any additional input from the
stream
 
verra' esaminata la stringa "abc" seguita dal carattere newline: /n
ed avremo che:
 
cin.gcount()==4 ; // numero caratteri in "abc" + " /n" == 4
 
...pero', per curiosita' , ho cercato di trovare una funzione che
stampasse la stringa "abc" dopo l'istruzione:
 
 cin.ignore(1000, '\n'); // clear out any additional input from the
stream
 
ma NON ho idea di come fare....qualche suggerimento?
 
 
Ciao e grazie mille!
 
 
 
 
 
 
 
 
 
 
 
 

 ma NON ho idea di come fare....qualche suggerimento?
 
Ti conviene un approccio differente...  se hai un compilatore che
accetta lo standard C++11, la funzione
 
int stoi(const string & str, size_t * idx = nullptr, int base = 10)
 
converte str in intero, saltando l'eventuale whitespace iniziale,
ritornando in idx l'indice del primo carattere scartato (nel tuo caso
la "a").  #include <string> , ovviamente; e leggi la string con
getline(cin, str), ovviamente, prima di chiamare stoi
 
-- 
(@_  | Maurizio Loreti
//\  |
V_/_ | EMail/ROT13: Znhevmv...@tznvy.pbz

 getline(cin, str), ovviamente, prima di chiamare stoi
 
Scusate se quoto me stesso, ma volevo essere piu' chiaro:
 
MLO@bigmac 15 $ cat foo.cxx
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
  string str = "123abc";
  size_t idx;
  int i = stoi(str, &idx);
  cout << "Da \"" << str << "\" ad intero: " << i << " seguito da \""
       << str.substr(idx) << '\"' << endl;;
  return 0;
}
MLO@bigmac 16 $ g++ -std=c++11 -o foo foo.cxx
MLO@bigmac 17 $ ./foo
Da "123abc" ad intero: 123 seguito da "abc"
MLO@bigmac 18 $ g++ --version
g++ (MacPorts gcc47 4.7.3_0) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.



 
Ti ringrazio per la soluzione alternativa, ma ritornando alla mia
domanda:
 
" ...pero', per curiosita' , ho cercato di trovare una funzione che
 stampasse la stringa "abc" dopo l'istruzione:
 
 cin.ignore(1000, '\n'); // clear out any additional input from the
 stream
 
ma NON ho idea di come fare....qualche suggerimento? "
 
...e *volendo utilizzare il codice che ho evidenziato nel primo post*,
quale potrebbe essere la soluzione  senza l'utilizzo della funzione
stoi() che suggerisci?....il tutto chiaramente a puro scopo
didattico....per eserecitarmi...
 
Ciao e grazie milleee!
 
 
 
 
 
 
 

Non farlo.  Se il linguaggio ti da uno strumento creato apposta per
conseguire uno scopo, non ha senso cercarne un altro.  Inoltre,
leggendo con un estrattore da cin ci si incasina *sempre*; IMHO
bisognerebbe gestire qualunque input leggendo invece per linee
(getline) e smanettandosi la string con gli strumenti opportuni.
 
Ascolta l'esparienza di 20+ anni di C++ (senza paternalismo).


 Ascolta l'esparienza di 20+ anni di C++ (senza paternalismo).
 
...era solo per esercitarmi....NON era mia intenzione mettere in
discussione la soluzione che hai proposto: *ed e' certamente la  piu'
valida!!!*....il mio scopo era *anche* quello di cercare di capire
piu' approfonditamente il funzionamento di cin.ignore(): il tutto,
sempre a scopo di esercizio.
 
Ho trovato anche questo esempio:
 
http://www.cplusplus.com/forum/articles/6046/
 
 
=================================================
 
#include <iostream>
#include<sstream>
#include <string>
using namespace std;
 
int main()
{
 // How to get a number.
 
 string input = "";
 int myNumber =0;
 
 while (true) {
 
   cout << "Please enter a valid number: ";
 
   getline(cin, input);
 
   // This code converts from string to number safely.
 
      stringstream myStream(input);
 
     if (myStream >> myNumber){
 
     break;
 
     }
 
 cout << "Invalid number, please try again" << endl;
 
 }
 
 cout << "You entered: " << myNumber << endl << endl;
 
 return 0;
}
 
=================================================
 
..che, *pero'*, accetta *anche* input di tipo stringa : "123abc" e
converte in numero intero: 123.
 
Ciao e grazie milleeeeeee!