2012-03-22 23 views
11

Estoy tratando de entender cómo funciona stringstream para poder identificar y convertir los posibles números que se ingresaron como cadenas ... por alguna razón este pequeño fragmento de código que escribí para tratar de comprender stringstream está siendo molesto con algunos errores ...stringstream errors 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; 
} 

errores:

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' 

¿qué estoy haciendo mal?

+1

No es la razón detrás de los mensajes de error, pero una cosa que está haciendo mal es usar 'stringstream', cuando debería usar' istringstream'. (El uso de 'fail' tampoco es muy idiomático.) –

Respuesta

22

es necesario incluir el siguiente archivo de cabecera -

#include <sstream> 

Siempre que vea errores como undefined class, siempre se debe buscar a una ficheros de cabecera primero.

Here es la documentación para la clase stringstream.

1

Incluir esto:

#include <sstream> 

Además, escriba esto:

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

Por cierto, se puede usar std::cin >> test en el main() como:

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; 
} 

Sin necesidad de str2int función!

+1

O simplemente' return ss >> num? num: 0; '? (Aunque probablemente separaría el '>>' en una declaración separada. 'Ss >> num; return ss? Num: 0;'.) –

+0

@JamesKanze: Eso es bueno. :-) – Nawaz

3

Para utilizar stringstream, debe hacer;

#include <sstream> 

Después de eso, todo parece funcionar como debería.

+0

smdh ... Debería irme a la cama jajaja. ese tipo de falta de atención es inaceptable ... gracias. –

3

Necesita incluir sstream.

#include <sstream>

2

tengo que añadir - si su proyecto utiliza encabezados precompilados (por ejemplo, "stdafx.h" para la aplicación de consola Win32 o "pch.h" para la aplicación de Windows Store) - ver las que se incluyen por delante de <sstream> .