2012-10-18 8 views
7

Ho trovato questo codice in linea come modello per eseguire una stringa su float/int/doppia conversione. È solo qui, quindi ho qualcosa da riferire per la domanda ....Stringa per flottare utilizzando stringstream

Voglio che un utente inserisca un numero come stringa, lo converta in un float, lo verifichi per il successo e lo abbandoni se l'inserimento fosse ' Q 'o stampare "Input non valido" se non era il carattere' Q'uit e ritornare per più input.

Qual è la sintassi per un test di errore di conversione? Sarebbe ss.fail()?

// using stringstream constructors. 
#include <iostream> 
#include <sstream> 
using namespace std; 

int main() { 

    int val; 
    stringstream ss (stringstream::in | stringstream::out); 

    ss << "120 42 377 6 5 2000"; 

    /* Would I insert an 

    if(ss.fail()) 
     { 
     // Deal with conversion error } 
     } 

    in here?! */ 


    for (int n=0; n<6; n++) 
    { 
    ss >> val; 
    cout << val*2 << endl; 
    } 

    return 0; 
} 
+0

ciò errore di sintassi hai trovato? –

risposta

9

Il tuo codice non è molto utile. Ma se ti capisco, fallo in questo modo

string str; 
if (!getline(cin, str)) 
{ 
    // error: didn't get any input 
} 
istringstream ss(str); 
float f; 
if (!(ss >> f)) 
{ 
    // error: didn't convert to a float 
} 

Non è necessario utilizzare fail.

2

In realtà, il modo più semplice per farlo galleggiare stringa di conversione è probabilmente boost::lexical_cast

#include <string> 
#include <boost/lexical_cast.hpp> 

int main() { 
    std::string const s = "120.34"; 

    try { 
     float f = boost::lexical_cast<float>(s); 
    } catch(boost::bad_lexical_cast const&) { 
     // deal with error 
    } 
} 

Ovviamente, nella maggior parte dei casi, semplicemente non intercettare l'eccezione subito e lasciarlo bolla la catena di chiamate, quindi il costo è molto ridotto.

0

Alcune delle caratteristiche richieste dalla domanda iniziale sono:

  1. uscita due volte il valore di ingresso galleggia ingressi validi
  2. rapporto
  3. proseguire la ricerca di carri allegorici, anche dopo l'incontro con gli ingressi non validi
  4. stop dopo aver visto un carattere 'Q'

Penso che il seguente codice soddisfi l'abo ve richiesta:

// g++ -Wall -Wextra -Werror -static -std=c++11 -o foo foo.cc 

#include <iostream> 
#include <sstream> 

void run_some_input(void) 
{ 
    std::string  tmp_s; 

    int not_done = 1; 

    while(not_done && getline(std::cin, tmp_s)) 
    { 
     std::stringstream ss; 

     ss << tmp_s; 

     while(! ss.eof()) 
     { 
      float tmp_f; 
      if (ss >> tmp_f) 
      { 
       std::cout << "Twice the number you entered: " 
          << 2.0f * tmp_f << "\n"; 
      } 
      else 
      { 
       ss.clear(); 
       std::string tmp_s; 
       if(ss >> tmp_s) 
       { 
        if(! tmp_s.compare("Q")) 
        { 
         not_done = 0; 
         break; 
        } 
        std::cout << "Invalid input (" << tmp_s << ")\n"; 
       } 
      } 
     } 
    } 
} 

int main(int argc __attribute__ ((__unused__)), char **argv __attribute__ ((__unused__))) 
{ 
    run_some_input(); 
} 

Ecco un esempio di sessione:

$ ./foo 
1 
Twice the number you entered: 2 
3 4 
Twice the number you entered: 6 
Twice the number you entered: 8 
5 bad dog Quit 6 8 Q mad dog 
Twice the number you entered: 10 
Invalid input (bad) 
Invalid input (dog) 
Invalid input (Quit) 
Twice the number you entered: 12 
Twice the number you entered: 16