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?
Antwort
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;
wie wissen, ob c nicht da ist, zum Beispiel waren die Zeichenfolge "123 456"? – unludo
@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. –
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(); '. –
fgets oder strtol
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.
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.
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
Nice Bit Code (ich verwende etwas fast das gleiche schon), obwohl es ein Ersatz für 'printf' statt 'sscanf' ist. –
- 1. Was soll ich anstelle von as.real verwenden?
- 2. Was soll ich anstelle von `qt5_use_modules` verwenden?
- 3. Was soll ich anstelle von printf in Perl verwenden?
- 4. Was sollte ich anstelle von isinstance() verwenden
- 5. Was kann ich anstelle von eval() verwenden?
- 6. Was kann ich anstelle von char.to_i verwenden?
- 7. Was soll ich anstelle der Teilspezialisierung von Funktionsvorlagen tun?
- 8. Soll ich pillar.get immer anstelle von pillar ['foo'] verwenden?
- 9. Was anstelle von org.jboss.resteasy.client.ClientRequest verwenden?
- 10. Was soll ich anstelle von UIScreen.mainScreen() verwenden? ApplicationFrame für swift in ios 9.1?
- 11. Was soll ich für git user.name verwenden?
- 12. Was sollte ich anstelle von Syncdb in Django 1.9 verwenden?
- 13. CGContextShowTextAtPoint veraltet - was soll ich jetzt verwenden?
- 14. Was soll ich für express.cookieParser() secret verwenden?
- 15. Marmalade SDK, was soll ich verwenden?
- 16. So verwenden Sie richtig sscanf
- 17. Was anstelle von polymorphen Assoziationen zu verwenden?
- 18. Wo soll ich protobuf verwenden
- 19. Soll ich mit Varnish anstelle von Nginx gehen?
- 20. Soll ich ProGuard verwenden?
- 21. Welche Version von openssl soll ich verwenden?
- 22. welche von == und =: = soll ich verwenden?
- 23. Soll ich Delegation hier verwenden?
- 24. Welchen Controller soll ich verwenden?
- 25. Ich interessiere mich für die Entwicklung einer Website von Grund auf. Wo soll ich anfangen? Was soll ich lernen? Was soll ich verwenden?
- 26. Soll ich Spry von Dreamweaver verwenden?
- 27. Soll ich ein WebView verwenden?
- 28. Was anstelle von str-utils Funktionen zu verwenden?
- 29. Soll ich den Zeiger std :: shared verwenden?
- 30. Funktion in PHP veraltet, was soll ich jetzt verwenden?
Warum versuchen "clever" zu sein? –
Zum Beispiel aus dem Grund sagte er, dass sscanf nicht typsicher ist. – jalf
@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