2012-03-22 16 views
11

Sto cercando di capire come funziona stringstream per poter identificare e convertire possibili numeri immessi come stringhe ... per qualche motivo questo piccolo pezzo di codice che ho scritto per cercare di capire stringstream è in fase di definizione fastidioso con alcuni errori ...errori stringstream C++

#include <iostream> 
#include <string> 

using namespace std; 

int str2int (const string &str) { 
    std::stringstream ss(str); 
    int num; 
    if((ss >> num).fail()) 
    { 
     num = 0; 
     return num; 
    } 
    return num; 
} 

int main(){ 
    int test; 
    int t = 0; 
    std::string input; 
    while (t !=1){ 
     std::cout << "input: "; 
     std::cin >> input; 
     test = str2int(input); 
     if(test == 0){ 
      std::cout << "Not a number..."; 
     }else 
      std::cout << test << "\n"; 
     std::cin >> t; 
    } 
    return 0; 
} 

errori:

Error C2079:'ss' uses undefined class std::basic_stringstream<_elem,_traits,_alloc>' 
Error C2228: left of '.fail' must have class/struct/union 
Error C2440: 'initializing': cannot convert 'const std::string' into 'int' 

quello che sto facendo di sbagliato?

+1

Non il motivo dietro i messaggi di errore, ma una cosa che si sta facendo male sta usando 'stringstream', quando si dovrebbe usare' istringstream'. (Anche l'uso di 'fail' non è molto idiomatico.) –

risposta

22

è necessario includere il seguente file di intestazione -

#include <sstream> 

Ogni volta che vedete errori come undefined class, si dovrebbe sempre cercare mancante file di intestazione prima.

Here è la documentazione per la classe stringstream.

1

Includi questo:

#include <sstream> 

Inoltre, scrivere questo:

if(ss >> num) //no .fail() 
{ 
    return num; //read succeeded 
} 
return 0; //read failed 

Tra l'altro, è possibile utilizzare std::cin >> test nel main() stessa come:

int main(){ 
    int test; 
    int t = 0; 
    while (t !=1){ 
     std::cout << "input: "; 
     if (std::cin >> test) 
      std::cout << test << "\n"; //read succeeded 
     else 
      std::cout << "Not a number..."; //read failed 
     std::cin >> t; 
    } 
    return 0; 
} 

Non c'è bisogno di str2int funzione!

+1

O semplicemente' return ss >> num? num: 0; '? (Anche se probabilmente separerei '>>' in un'istruzione separata. 'Ss >> num; restituisce ss? Num: 0;'.) –

+0

@JamesKanze: È bello. :-) – Nawaz

3

Per utilizzare stringstream, è necessario eseguire;

#include <sstream> 

Dopodiché, tutto sembra funzionare come dovrebbe.

+0

smdh ... dovrei andare a letto lol. quel tipo di mancanza di attenzione è inaccettabile ... grazie. –

3

È necessario includere sstream.

#include <sstream>

2

ho bisogno di aggiungere - se il progetto utilizza intestazioni precompilate (ad esempio, "stdafx.h" per Win32 console app o "pch.h" per Windows Store) - si prega di verificare che siano inclusi davanti di <sstream> .