C ++ - Alternative zum Parsen der Eingabe mit sscanf

8

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.

    
ph4nt0m 25.04.2014, 22:33
quelle

4 Antworten

6

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:

%Vor%

Sie können den so erstellten Manipulator verwenden, um Zeichen zu extrahieren:

%Vor%     
Dietmar Kühl 26.04.2014, 00:13
quelle
4

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.

%Vor%     
sehe 25.04.2014 23:06
quelle
1

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.

    
0x499602D2 25.04.2014 23:07
quelle
1

Mit alter Schule und Einfachheit:

%Vor%

Dies funktioniert, weil der Extraktionsoperator führende Leerzeichen für numerische Typen überspringt.

    
Thomas Matthews 25.04.2014 23:49
quelle

Tags und Links