Ich habe eine Regex für übereinstimmende Terme eines Polynoms, die ich verwenden werde, um eine Funktion zu implementieren, um einen String in eine Polynomklasse zu verwandeln. Sie können die Regex-Demo here mit den richtigen Übereinstimmungen sehen, die erzeugt werden. Wenn ich jedoch versuche, es zu implementieren, findet mein Programm die Übereinstimmungen richtig, aber druckt sie bizarr auf dem Bildschirm. Zum Beispiel:Warum stimmt meine C++ Regex korrekt überein, gibt aber nicht den richtigen Wert zurück?
-21323x^5+1233x4+123x^2-1232
Trying to match: -21323x^5+1233x4+123x^2-1232
-21323x^5
Trying to match: +1233x4+123x^2-1232
1233x4
Trying to match: +123x^2-1232
12xx^2
Trying to match: -1232
-1232
In diesem Fall aus irgendeinem Grund druckt es 12xx^2
statt 123x^2
Und ein anderer:
-1234x^5+789x4+6x^2-567+123x
Trying to match: -1234x^5+789x4+6x^2-567+123x
-1234x^5
Trying to match: +789x4+6x^2-567+123x
789x4
Trying to match: +6x^2-567+123x
x^22
Trying to match: -567+123x
-567
Trying to match: +123x
23xx
In diesem Fall zeigt es x^22
statt 6x^2
und 23xx
statt 123x
.
Dies ist mein Code:
Poly* Poly::fromString(std::string str) {
Poly* re = new Poly;
bool returnNull = true;
std::regex r_term("((-?[0-9]*)x(\\^?([0-9]+))?|-?[0-9]+)");
std::smatch sm;
while(std::regex_search(str, sm, r_term)) {
returnNull = false;
std::cout << "Trying to match: " << str << std::endl;
str = sm.suffix().str();
std::cout << sm.str() << std::endl;
}
if(returnNull) {
delete re;
return nullptr;
} else return re;
}
Verschieben Sie die Zuweisung 'str = sm.suffix(). Str();' unterhalb der Zeile, in der Sie 'sm.str()' drucken. 'smatch' enthält keine Kopie der Übereinstimmung, nur Iteratoren in der ursprünglichen Zeichenfolge. Wenn Sie die Zeichenfolge darunter ändern, macht Ihr Programm diese Iteratoren ungültig und weist daher ein undefiniertes Verhalten auf. –
Das macht Sinn. Vielen Dank. Bitte fügen Sie dies als Antwort hinzu. –