2009-06-23 19 views
24

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?

+2

Perché cercare di essere "intelligente"? –

+11

Ad esempio, per il motivo che ha detto, sscanf non è sicuro dal punto di vista del tipo. – jalf

+5

@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

risposta

36

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; 
+0

come sapere se c non è lì, per esempio la stringa era "123 456"? – unludo

+0

@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. –

+1

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(); '. –

-1

fgets o strtol

2

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.

5

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.

0

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

+0

Bel po 'di codice (sto usando qualcosa di quasi lo stesso già), sebbene sia un sostituto di 'printf' piuttosto che' sscanf'. –

Problemi correlati