Ho un problema che sscanf risolve (estraendo le cose da una stringa). Comunque non mi piace sscanf dato che non è sicuro per il tipo ed è vecchio e orribile. Voglio essere intelligente e utilizzare alcune parti più moderne della libreria standard C++. Cosa dovrei usare invece?Cosa dovrei usare al posto di sscanf?
risposta
Penso che le altre risposte mancano il punto. La domanda non riguarda l'I/O, riguarda l'estrazione di dati da una stringa.
Prova stringstream:
#include <sstream>
...
std::stringstream s("123 456 789");
int a, b, c;
s >> a >> b >> c;
come sapere se c non è lì, per esempio la stringa era "123 456"? – unludo
@unludo: In questo caso, 'c' non sarà modificato. È possibile inizializzare 'c' con un valore predefinito, oppure potrebbe essere necessario un parsing più sofisticato. Un tokenizer probabilmente funzionerebbe. –
A partire da C++ 11, 'c' sarebbe stato reimpostato su' 0', e prima credo che il suo valore post-fallimento non fosse definito. Ad ogni modo, per verificare se 'c' è lì usa lo stato del flusso (per comodità, da' operator bool() '):' if (s >> a >> b) if (s >> c) abc_there(); else ab_there(); else didnt_have_a_and_b(); '. –
fgets o strtol
Se si include sstream
avrete accesso alle classi stringstream che forniscono corsi d'acqua per le stringhe, che è quello che serve. Roguewave ha qualche buon examples on how to use it.
Per la maggior parte dei lavori flussi standard fanno il lavoro alla perfezione,
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 avete bisogno di strumenti più potenti per l'analisi più complessa, allora si potrebbe prendere in considerazione Regex o addirittura Spirito da Boost.
Se si desidera veramente non utilizzare gli stream (è utile per la leggibilità), è possibile utilizzare StringPrintf.
Potete trovare la sua attuazione a Folly:
https://github.com/facebook/folly/blob/master/folly/String.h#L165
Bel po 'di codice (sto usando qualcosa di quasi lo stesso già), sebbene sia un sostituto di 'printf' piuttosto che' sscanf'. –
- 1. Cosa dovrei usare al posto di com.google.appengine.repackaged *?
- 2. Cosa dovrei usare al posto di LoadWithPartialName()?
- 3. Cosa dovrei usare al posto di printf in Perl?
- 4. Cosa dovrei usare al posto di syncdb in Django 1.9?
- 5. Cosa dovrei usare al posto di windows.h in linux
- 6. Cosa dovrei usare al posto di UISegmentedControlStyleBezeled deprecato in iOS5.1?
- 7. Cosa usare al posto di as.real?
- 8. Cosa usare al posto di `qt5_use_modules`?
- 9. Cosa possiamo usare al posto di nstimer?
- 10. Quale ORM dovrei usare al posto di Linq su Sql?
- 11. Quando dovrei usare un UserControl al posto di una Pagina?
- 12. Perché dovrei usare var al posto di un tipo?
- 13. In monodroid o monotouch cosa dovrei usare al posto di app.config per le stringhe di configurazione?
- 14. Cosa usare al posto di FileReader per Safari?
- 15. Cosa usare al posto delle funzioni str-utils?
- 16. cosa devo usare al posto di urlopen in urllib3
- 17. Cosa usare al posto di un ciclo principale in Haskell?
- 18. SetupSet() è obsoleto. Al posto di cosa?
- 19. Linguaggio Crystal: cosa usare al posto del runtime String :: to_sym
- 20. Che cosa gacutil.exe dovrei usare?
- 21. Registrazione C#. Cosa dovrei usare?
- 22. Come usare sscanf in loop?
- 23. Cosa usare al posto di getRequest() -> get (...) nel controller di
- 24. Perché dovrei usare OkHttp al posto di Android HttpClient e AsyncTask
- 25. Quando dovrei usare Perl CGI al posto di PHP (o viceversa)?
- 26. Quando usare mvn clean install al posto di mvn install?
- 27. Per cosa dovrei usare Stackless Python?
- 28. Che cosa dovrei usare IronPython IDE?
- 29. Cosa dovrei usare come manichino attendibile?
- 30. Che cosa dovrei # include usare 'htonl'?
Perché cercare di essere "intelligente"? –
Ad esempio, per il motivo che ha detto, sscanf non è sicuro dal punto di vista del tipo. – jalf
@Kaleb Pederson: Per molti parlanti inglese, "intelligente" può solo significare "intelligente" e non ha la connotazione negativa che talvolta ha negli Stati Uniti. Si noti che Ben Hymers è originario del Regno Unito. – Naaff