Segmentation fault bei string Zerlegung
-
Hallo Leute,
Ich arbeite zur Zeit an einem Programm, das unter anderem eine Funktion verwendet, die Tausendertrennpunkte in Strings setzt.
(z.B. soll die Zahl 1000000 nach Einsatz der Funktion so aussehen: 1.000.000)Ohne Ausführen dieser Funktion läuft alles einwandfrei.
Mit ihr bekomme ich allerdings einen Segmentation fault.Die Funktion sieht so aus:
string setSeperationDots(string str){ int commaPos = str.find(","); string beforeComma = str.substr(0, (str.length() - (str.length() - commaPos))); string afterComma = str.substr(commaPos + 1, (str.length() - commaPos)); int dotCount = afterComma.length()/3; string finishString = "," + afterComma; string endOfPartString = beforeComma; for (int i = 0; i < dotCount; i++) { string partString = endOfPartString.substr(endOfPartString.length()-3, endOfPartString.length()); finishString = "." + partString + finishString; endOfPartString = endOfPartString.substr(0, endOfPartString.length() - 3); } finishString = (beforeComma.substr(0, beforeComma.length()-(dotCount*3))) + finishString; str = finishString; return str; }Hat jemand ne Idee?
-
Mit ihr bekomme ich allerdings einen Segmentation fault.
Und in welcher Zeile? Finde es heraus! Ansonsten einige Anmerkungen:
int commaPos = str.find(",");Was passiert, wenn str kein Komma enthaelt? Also der Rueckgabewert von
str.findgleichnposist?(str.length() - (str.length() - commaPos)));Was das denn? x - (x - a) = x - x + a = a
int dotCount = afterComma.length()/3;Wird die Punkteanzahl nicht vom Teil vor dem Komma bestimmt?
string afterComma = str.substr(commaPos + 1, (str.length() - commaPos)); ... string finishString = "," + afterComma;Also mit der +1 haust du das Komma raus, um es dann wieder einzufuegen?
-
R3aper schrieb:
Hat jemand ne Idee?
Zeig uns das vollständige Beispielprogramm, ganz besonders den String der zum Aufruf benutzt wird.
Du hast keinerlei Abfragen, ob deine Aktionen überhaupt erfolgreich waren. So etwas wie find kann schließlich auch nichts finden, wenn nichts da sein sollte. Dann greifst du trotzdem auf den Index zu. Dieser ist aber ein Fehlerwert.
Segfault.
-
Ok Leute, der Fehler ist gefunden.
Wie knivil erwähnt hat sollte es nichtint dotCount = afterComma.length()/3;heißen, sondern
int dotCount = beforeComma.length()/3;Da ist es natürlich klar, dass ich auf den falschen Speicher zugreife.
Trotzdem auch danke an den Rest, weil ihr bezüglich Codeoptimierung und Errorhandling natürlich recht habt.

Schönen Tag noch!

-
Aktiviere den Debug-Modus deiner Standardbibliothek und lass dein Programm im Debugger laufen.
Ich hatte gestern abend eine "assertion failure", weil ich mit 'nem Index für einen Vektor außerhalb des gültigen Bereichs war und das Programm kackte ab (terminate). Starte ich das mit dem Debugger (hier: GDB unter Windows), setze ich ein break auf _assert und lasse das Programm dann laufen, dann hält es an der besagten Stelle einfach an und ich kann mir den Stack Trace anzeigen lassen und angucken, was so in den Variablen steht. Das lernt man vielleicht nicht unbedingt aus seinem C++ Buch. Es ist aber wichtig und man sollte sich damit und mit der Doku des Compilers mal beschäftigt haben! So ein Debugmodus der Standardbibliothek ist echt praktisch. Das ist dann auch ein weiterer guter Grund für std::array<int,5> gegenüber int[5] weil mir std::array im Debugmodus eine Bereichsüberprüfung macht und so weiter...