Cosa dovrei usare al posto di sscanf?
-
06-07-2019 - |
Domanda
Ho un problema che sscanf risolve (estraendo cose da una stringa). Sscanf non mi piace però dal momento che non è sicuro per i tipi ed è vecchio e orribile. Voglio essere intelligente e usare alcune parti più moderne della libreria standard C ++. Cosa dovrei usare invece?
Soluzione
Prova std :: stringstream
:
#include <sstream>
...
std::stringstream s("123 456 789");
int a, b, c;
s >> a >> b >> c;
Altri suggerimenti
Per la maggior parte dei lavori i flussi standard eseguono perfettamente il lavoro,
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
}
Se hai bisogno di strumenti più potenti per analisi più complesse, allora potresti prendere in considerazione Regex o persino Spirit from Boost.
Se includi sstream
avrai accesso alle classi stringstream che forniscono flussi per stringhe, che è ciò di cui hai bisogno. Roguewave ha alcuni buoni esempi su come usarlo .
Se vuoi davvero non usare i flussi (è buono a causa della leggibilità), puoi usare StringPrintf.
Puoi trovarne l'implementazione in Folly:
https://github.com/facebook/folly/ blob / master / follia / string.h # L165
fgets o strtol