2009-06-23 19 views
24

Ich habe ein Problem, dass SScanf löst (Extrahieren von Dingen aus einer Zeichenfolge). Ich mag es aber nicht, weil es nicht typsicher ist und alt und schrecklich ist. Ich möchte clever sein und einige modernere Teile der C++ - Standardbibliothek verwenden. Was sollte ich stattdessen verwenden?Was soll ich anstelle von sscanf verwenden?

+2

Warum versuchen "clever" zu sein? –

+11

Zum Beispiel aus dem Grund sagte er, dass sscanf nicht typsicher ist. – jalf

+5

@Kaleb Pederson: "Clever" kann für viele Englisch sprechende Menschen nur "intelligent" bedeuten und hat nicht die negative Konnotation, die es manchmal in den USA hat. Beachten Sie, dass Ben Hymers aus Großbritannien kommt. – Naaff

Antwort

36

Ich denke, die anderen Antworten fehlen den Punkt. Die Frage betrifft nicht I/O, es geht darum, Daten aus einer Zeichenkette zu extrahieren.

Try string:

#include <sstream> 

... 

std::stringstream s("123 456 789"); 
int a, b, c; 
s >> a >> b >> c; 
+0

wie wissen, ob c nicht da ist, zum Beispiel waren die Zeichenfolge "123 456"? – unludo

+0

@unludo: In diesem Fall wäre "c" unverändert. Sie könnten 'c' mit einem Standardwert initialisieren, oder Sie benötigen möglicherweise ein ausgefeilteres Parsing. Ein Tokenizer würde wahrscheinlich funktionieren. –

+1

Ab C++ 11 würde "c" auf "0" zurückgesetzt werden, und davor glaube ich, dass der Wert nach dem Fehler undefiniert war. Wie auch immer, um zu überprüfen, ob "c" da ist, benutze den Stream-Status (zur Vereinfachung von 'operator bool()'): 'if (s >> a >> b) if (s >> c) abc_there(); sonst ab_there(); else didnt_have_a_and_b(); '. –

-1

fgets oder strtol

2

Wenn Sie sstream enthalten haben Sie Zugriff auf die string Klassen, die Ströme für Streicher liefern, das ist, was Sie brauchen. RogueWave hat einige gute examples on how to use it.

5

Für die meisten Jobs Standard-Streams perfekt die Arbeit zu tun,

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 
} 

Wenn Sie mehr leistungsfähige Werkzeuge für komplexere Analyse benötigen, dann könnte man Regex oder sogar Geist von Boost-betrachten.

0

Wenn Sie wirklich keine Streams verwenden wollen (es ist gut wegen der Lesbarkeit), können Sie StringPrintf verwenden.

Sie können ihre Umsetzung in Folly finden:

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

+0

Nice Bit Code (ich verwende etwas fast das gleiche schon), obwohl es ein Ersatz für 'printf' statt 'sscanf' ist. –

Verwandte Themen