Funktion mit Referenzen realisieren
-
Hallo zusammen,
ich habe eine Funktion geschrieben,
welche aus einem String zwei Zahlen rausfiltert und diese dann addiert. Würde jetzt gerne diese Funktion mit Referenzen realisieren. Wenn man mit Referenzen arbeiten möchte muss man ja die Funktion so schreibenint sum_reference(std::string& text){}
Habe die Funktion schon ohne Referenzen realisiert, nun möchte ich sie mit Referenzen realisieren. Das einzigste was ich vorgenommen hatte war das hinzufügen des '&' bei der Funktion. Und dann kommt es zu einer Fehlermeldung.(diese unten aufgezeigt ist)
Die Überhabe einer Variablen in die Funktion (mit Referenz, wie das obige Code-Fragment) sorgt doch dafür, dass die übergebene und Funktionsvariable die gleiche Speicheradresse haben. Zudem Frage ich mich wie ich die Rückgabe (return result) realisiere.
Die Fehlermeldung die ich bekommen habe sieht so aus:
libc++abi: terminating with uncaught exception of type std::out_of_range: basic_string
(ich nutze CLion)
Kann mir da jemand weiterhelfen?
Gruß JohnHier der Code:
int sum(std::string text){ std::string backup_text = text; int plus_location = text.find('+'); text.erase(plus_location,text.size() ); // Filterung der Zahl 1 std::stringstream ss(text); // string Fragment 1 in int umwandeln int num1; ss >> num1; backup_text.erase(0, plus_location+1); // Filterung der Zahl 2 std::stringstream ss1(backup_text); // string Fragment 2 in int umwandeln int num2; ss1 >> num2; int result = num1 + num2; //Ergebnis Berechnung von num1 & num2 return result; }
-
@Johnny01 sagte in Funktion mit Referenzen realisieren:
Hallo zusammen,
ich habe eine Funktion geschrieben,
welche aus einem String zwei Zahlen rausfiltert und diese dann addiert. Würde jetzt gerne diese Funktion mit Referenzen realisieren. Allerdings treten hierbei Fehler auf.Welche?
-
@Johnny01 sagte in Funktion mit Referenzen realisieren:
Allerdings treten hierbei Fehler auf.
-
Formatier´ deinen Quelltext bitte mit den Code-Tags. Das wurde dir in deinem letzten Post auch schon gesagt, Warum sollten sich andere Leute Mühe geben, deine Frage zu beantworten, wenn du dir schon keine Mühe beim Stellen der Frage gibst?
-
Welche Fehler treten denn auf? Bitte die Fehlermeldungen per Copy & Paste einstellen.
-
-
@DocShoe habe meine Frage überarbeitet. Hoffe meine Formatierung passt jetzt.
-
Wenn dann solltest du eine nicht-konstante Referenz
const std::string&
benutzen, da der String innerhalb der Funktion nur gelesen wird (und nicht verändert).Und die Exception kommt, weil du den Rückgabewert von
text.find('+')
nicht überprüfst, ob das Zeichen überhaupt vorkommt (s. std::basic_string::find). Oder mit welchem Text rufst du die Funktion auf?PS: Dein Code geht kürzer und eleganter...
-
Sehr schön.
std::string::erase
erwartet einen iterator, keinen Index. Ein iterator ist eine Art Zeiger, die eine Position in einem container identifiziert.plus_location
und0
sind keine gültigen iteratoren, bei deren Benutzung greifst du auf ungültigen Speicher und daraus resultiert dein Fehler. Das hat mit Referenzen jetzt nichts zu tun. Schnapp´ dir dein C++ Lehrbuch und such das Kapitel, das sich mit der STL und dem iteratoren-Konzept befasst.
-
@DocShoe: Dann hast du wohl nicht richtig in der Referenz geschaut: std::basic_string::erase (gleich die erste Überladung ;- )
-
Wenn du mit stringstreams arbeiten willst (das könnte man in Frage stellen wollen), dann geht dein Code einfacher:
int rechnen(const std::string &text) { std::stringstream ss(text); int a, b; char op; if (ss >> a >> op >> b) { // hier versucht man zahl, zeichen und zahl aus ss zu lesen if (op == '+') return a + b; if (op == '-') return a - b; throw runtime_error("Ungültiger Operator"); } throw runtime_error("Ungültiges Format"); }
-
Tatsächlich, war mir nicht bekannt. o.O