c++ - fscanf - ¿Qué debo usar en lugar de sscanf?
scanf c int (5)
Tengo un problema que sscanf resuelve (extraer cosas de una cadena). No me gusta sscanf, ya que no es de tipo seguro y es viejo y horrible. Quiero ser inteligente y usar algunas partes más modernas de la biblioteca estándar de C ++. ¿Qué debo usar en su lugar?
Para la mayoría de los trabajos, los flujos estándar hacen el trabajo perfectamente,
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 poderosas para un análisis más complejo, entonces podría considerar Regex o incluso Spirit from Boost.
Si incluye sstream
, tendrá acceso a las clases de cadena de cadena que proporcionan secuencias para cadenas, que es lo que necesita. Roguewave tiene algunos buenos ejemplos de cómo usarlo.
Si realmente no quieres usar streams (es bueno debido a la legibilidad), puedes usar StringPrintf.
Puedes encontrar su implementación en Folly:
https://github.com/facebook/folly/blob/master/folly/String.h#L165
fgets o strtol
Intente std::stringstream
:
#include <sstream>
...
std::stringstream s("123 456 789");
int a, b, c;
s >> a >> b >> c;