web-dev-qa-db-fra.com

Que devrais-je utiliser à la place de sscanf?

J'ai un problème que sscanf résout (extraire des éléments d'une chaîne). Je n'aime pas sscanf car ce n'est pas digne de ce nom, il est vieux et horrible. Je veux être intelligent et utiliser des parties plus modernes de la bibliothèque standard C++. Que devrais-je utiliser à la place?

26
Ben Hymers

Essayez std::stringstream :

#include <sstream>

...

std::stringstream s("123 456 789");
int a, b, c;
s >> a >> b >> c;
38
Fred Larson

Pour la plupart des travaux, les flux standard fonctionnent parfaitement.

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 vous avez besoin d'outils plus puissants pour une analyse plus complexe, vous pouvez envisager Regex ou même Spirit de Boost.

5
AraK

Si vous incluez sstream, vous aurez accès aux classes stringstream qui fournissent des flux pour les chaînes, ce dont vous avez besoin. Roguewave a quelques bons exemples d'utilisation.

2
Kaleb Pederson

Si vous voulez vraiment ne pas utiliser de flux (c'est bien pour la lisibilité), vous pouvez utiliser StringPrintf.

Vous pouvez trouver son implémentation dans Folly:

https://github.com/facebook/folly/blob/master/folly/String.h#L165

0
iampat