Einige Hintergrundinformationen, für eine Hausaufgabe musste ich einen polnischen Notationsrechner mit binären Bäumen schreiben, damit dies funktioniert, musste ich die Kommandozeileneingabe analysieren, so dass es den Binärbaum und dann gehe darüber hinweg, um eine gültige Antwort auf den eingegebenen mathematischen Ausdruck zu geben.std :: stringstream seltsames Verhalten
Für die Analyse habe ich einen std :: stringstream verwendet, so dass ich die std :: string, die ich übergeben habe, problemlos in einen gültigen float (oder integer, double) konvertieren könnte. Das Problem, auf das ich stieß, war der folgende Code, in dem der Fehler angezeigt wird und wie ich das Problem gelöst habe. Ich hatte gehofft, dass jemand mir sagen könnte, wenn ich etwas falsch mache und .clear() nicht korrekt ist, oder wenn dies ein Fehler in der Standardbibliothek ist, in der Art, wie er mit dieser bestimmten Eingabe umgeht (nur für + und -).
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string mystring("+");
int num;
char op;
std::stringstream iss(mystring);
iss >> num;
// Seems it is not a number
if (iss.fail()) {
// This part does not work as you would expect it to
// We clear the error state of the stringstream
iss.clear();
std::cout << "iss fail bit: " << iss.fail() << std::endl;
iss.get(op);
std::cout << "op is: " << op << " iss is: " << iss.str() << std::endl;
std::cout << "iss fail bit: " << iss.fail() << std::endl;
// This however works as you would expect it to
std::stringstream oss(iss.str());
std::cout << "oss fail bit: " << oss.fail() << std::endl;
oss.get(op);
std::cout << "op is: " << op << " oss is: " << oss.str() << std::endl;
std::cout << "oss fail bit: " << oss.fail() << std::endl;
} else {
// We got a number
}
}
Beispiel für eine Ausgabe aus dem Programm:
iss fail bit: 0
op is: iss is: +
iss fail bit: 1
oss fail bit: 0
op is: + oss is: +
oss fail bit: 0
Vielleicht Jungs werden Sie sehen etwas, was ich verpasst haben, oder wenn dies in der Tat ein Fehler über mein Programm höher ist, in welchem Fall Zeiger, wo zu berichten würde dies sehr geschätzt werden.
Allerdings wurde zu diesem Zeitpunkt das + nicht gelesen, da es nie aus dem Stream extrahiert wird, da es keine gültige Zahl ist. Warum wird der Lesezeiger vorwärts bewegt, wenn er fehlschlägt? –
Das ist die Magie von Stream I/O, fürchte ich. Du musst mit den Dingen umgehen, so wie sie sind, nicht so, wie du es gerne hättest. –
X-Istence Ich denke, es wird extrahiert, weil "+" ein gültiger Teil einer positiven Zahl ist. wie "+10". Wie auch immer, sollte es nicht "suchen" (suchen) statt "suchen" (suchen) sein? –