Angenommen, mein Programm erwartet Argumente der Form [ 0.562 , 1.4e-2 ]
(d. h. Paare von Gleitkommazahlen). Wie soll ich diese Eingabe in C ++ ohne reguläre Ausdrücke analysieren? Ich weiß, dass es viele Eckfälle zu berücksichtigen gibt, wenn es um Benutzereingaben geht, aber nehmen wir an, die gegebene Eingabe stimmt fast mit dem obigen Format überein (abgesehen von weiteren Leerzeichen).
In C könnte ich etwas wie sscanf(string, "[%g , %g]", &f1, &f2);
machen, um die zwei Fließkommawerte zu extrahieren, was sehr kompakt ist.
In C ++ habe ich es so weit gebracht:
%Vor% Wie kann ich diesen Code verbessern? Insbesondere geht es mir um die Zeichenfolge garbage
, aber ich weiß nicht, wie ich sonst die ,
zwischen den beiden Werten überspringen soll.
Der offensichtliche Ansatz besteht darin, einen einfachen Manipulator zu erstellen und diesen zu verwenden. Beispiel: Ein Manipulator, der ein statisch bereitgestelltes char
verwendet, um festzustellen, ob das nächste Nicht-Leerzeichen das Zeichen ist, und wenn dies der Fall ist, könnte es so aussehen:
Sie können den so erstellten Manipulator verwenden, um Zeichen zu extrahieren:
%Vor%Ich kann es dir leisten, Boost zu benutzen, du könntest Spirit benutzen.
Siehe
Von einem string
Live auf Coliru (in c ++ 03):
Update Und hier ist der Ansatz, wenn Sie tatsächlich versuchen, aus einem Stream zu lesen (es ist tatsächlich etwas einfacher und integriert wirklich gut mit Ihrem anderen Stream lesen Aktivitäten):
Live auf Coliru too (c ++ 03)
Obwohl dies etwas ausführlicher erscheint, ist Spirit auch ein viel mächtiger und typsicherer als sscanf
. Und es funktioniert auf Streams.
Beachten Sie auch, dass inf
, -inf
, nan
wie erwartet behandelt werden.
Abgesehen von regulären Ausdrücken gibt es wahrscheinlich etwas in Boost, das Sie verwenden können. Wenn Sie Boost nicht verwenden können, können Sie eine std::ctype<char>
-Facette definieren, die alle unnötigen Zeichen ignoriert, indem sie sie als Whitespace klassifiziert. Sie können diese Facette in ein Gebietsschema installieren und in ss
einfügen.
Mit alter Schule und Einfachheit:
%Vor%Dies funktioniert, weil der Extraktionsoperator führende Leerzeichen für numerische Typen überspringt.