2009-06-23 37 views
24

Tengo un problema que sscanf resuelve (extraer elementos de una cadena). No me gusta el sscanf, ya que no es seguro y es viejo y horrible. Quiero ser inteligente y usar algunas partes más modernas de la biblioteca estándar de C++. ¿Qué debería usar en su lugar?¿Qué debo usar en lugar de sscanf?

+2

¿Por qué tratar de ser "inteligente"? –

+11

Por ejemplo, por la razón que dijo, ese sscanf no es seguro para tipos. – jalf

+5

@Kaleb Pederson: para muchos hablantes de inglés, "inteligente" puede significar "inteligente" y no tiene la connotación negativa que a veces tiene en los Estados Unidos. Tenga en cuenta que Ben Hymers es del Reino Unido. – Naaff

Respuesta

36

creo que las otras respuestas no viene al caso. La pregunta no es sobre I/O, se trata de extraer datos de una cadena.

Try stringstream:

#include <sstream> 

... 

std::stringstream s("123 456 789"); 
int a, b, c; 
s >> a >> b >> c; 
+0

cómo saber si c no está allí, por ejemplo, la cadena fue "123 456"? – unludo

+0

@unludo: En ese caso, 'c' no se modificaría. Podría inicializar 'c' con un valor predeterminado, o podría necesitar un análisis más sofisticado. Un tokenizer probablemente funcione. –

+1

A partir de C++ 11, 'c' se restablecería a' 0' y, antes de eso, creo que su valor posterior a la falla no estaba definido. De todos modos, para verificar si 'c' está allí use el estado de la corriente (por conveniencia, de' operator bool() '):' if (s >> a >> b) if (s >> c) abc_there(); else ab_there(); else didnt_have_a_and_b(); '. –

-1

fgets o strtol

2

Si incluye sstream tendrá acceso a las clases stringstream que proporcionan flujos de cuerdas, que es lo que necesita. Roguewave tiene buenas examples on how to use it.

5

Para la mayoría de puestos de trabajo flujos estándares hacen el trabajo a la perfección,

std::string data = "AraK 22 4.0"; 
std::stringstream convertor(data); 
std::string name; 
int age; 
double gpa; 

convertor >> name >> age >> gpa; 

if(convertor.fail() == true) 
{ 
    // if the data string is not well-formatted do what ever you want here 
} 

Si necesita herramientas más potentes para el análisis más complejo, entonces usted podría considerar la expresión regular o incluso Espíritu de Boost.