Vielleicht, nur vielleicht, durch das Denken aus, wir kommen mit eine Lösung.
Wir wissen, dass operator>>
die Verarbeitung beenden wird, wenn auf ein Zeichen trifft, das keine Ziffer ist. Also können wir diese Tatsache nutzen.
int multiplier = 0;
ss >> multiplier;
Die nächsten Zeichen sind keine Ziffern, sie könnten also ein Operatorzeichen sein.
Was passiert, wenn wir in einem Zeichen lesen:
char operation = '?';
ss >> operation;
Oh, ich vergaß zu erwähnen, dass die operator>>
Räume, die durch Standard überspringen wird.
Schließlich können wir Eingang die zweite Zahl:
int multiplicand = 0;
ss >> multiplicand;
Um zu bestätigen, lassen Sie uns auszudrucken, was wir in gelesen haben:
std::cout << "First Number: " << multiplier << "\n";
std::cout << "Operation : " << operation << "\n";
std::cout << "Second Number: " << multiplicand << "\n";
Mit einem Debugger hier zeigen wird dazu beitragen, was geschieht, wie jede Aussage ausgeführt wird, eins nach dem anderen.
Edit 1: Kompliziertere
Sie können immer komplizierter und verwenden Sie einen Parser, Lexer oder schreiben Sie Ihre eigenen. Eine gute Methode zur Implementierung ist die Verwendung einer Zustandsmaschine.
Zum Beispiel würden Sie ein einzelnes Zeichen lesen und dann entscheiden, was damit zu tun ist, abhängig vom Status. Wenn das Zeichen beispielsweise eine Ziffer ist, möchten Sie möglicherweise eine Zahl erstellen. Für ein Zeichen (außer Leerraum), wandeln Sie es in ein Token um und speichern Sie es irgendwo.
Es gibt Syntaxbäume und andere Datenstrukturen, die den Vorgang des Parsens erleichtern können. Es gibt auch Parsing-Bibliotheken wie boost::spirit
, Yacc, Bison, Flex und Lex.
Sie müssen wahrscheinlich einen Parser. Such dir Yacc oder Bison an. –
Mögliches Duplikat von [Teilen einer Zeichenkette in C++?] (Http://stackoverflow.com/questions/236129/split-a-string-in-c) – Jonas
Dank ich fand heraus, dass der Zeichenkette Strom aufhört, zu lesen, wenn unterschiedliche Art trifft. –