Programmabsturz bei return NULL;
-
Hallo zusammen!
Ich habe mal wieder ein "kleines Problemchen".
Für mein CGI-Projekt fehlt nun noch der Parser, der mir ziemlich nervtötend im Weg steht. Grundsätzlich funktioniert er, denn er soll aus einem Link den Inhalt von einer gesuchten Variable (SearchTerm) liefern. Das macht er auch wunderbar.
Allerdings gibt es einen Programmabsturz, wenn ein NULL-Pointer zurückgegeben wird, also die gesuchte Variable (SearchTerm) nicht im Link (Text) zu finden ist.
"...hat ein Problem festgestellt und musste beendet werden."
#include <iostream> char * VarParse (char *const& Text, char *const& SearchTerm); int main() { char * Input = "variable1=variable1-inhalt&string=string-inhalt"; // Den Ursprungstext und das gesuchte Wort übergeben std::cout << VarParse(Input, "string") << std::endl; std::cout << VarParse(Input, "variable1") << std::endl; VarParse(Input, "blabla"); return 0; } char * VarParse (char *const& Text, char *const& SearchTerm) { // Die Laengen der übergeben Strings werden ermittelt int TextLen = strlen(Text); int SearchTermLen = strlen(SearchTerm); char * SearchResult = strstr(Text, SearchTerm); int SearchResultLen = strlen(SearchResult); if (NULL == SearchResult) return NULL; int i = 0, j = 0; i = (TextLen-SearchResultLen+SearchTermLen+1); char * NewText = new char [255]; while ('\0' != Text[i] && '&' != Text[i]) { NewText[j] = Text[i]; i++; j++; } // Eine terminierende Null anfügen NewText[j] = '\0'; return NewText; }
-
Tue dir doch den Gefallen und arbeite mit std::string. Damit löst sich nicht nur dein aktuelles Problem, sondern auch sämtliche Speicherlecks in Luft auf. Als "leeren" String gibst du dann halt "" zurück.
-
Hallo,
das habe ich bereits gemacht, doch mein Lehrer will nicht, dass wir mit Klassen arbeiten bzw. OOP anwenden...
-
if (NULL == SearchResult) return "";und deine Probleme sind gelöst.
wenn dein lehrer kein oop will, dann nimm printf!
-
ahh bullshit jeschriebe, ein wort überlesen
-
esey schrieb:
if (NULL == SearchResult) return "";und deine Probleme sind gelöst.
wenn dein lehrer kein oop will, dann nimm printf!
Hmm... Wenn ich das mache, kommt der gleiche Fehler...
-
root2k schrieb:
das habe ich bereits gemacht, doch mein Lehrer will nicht, dass wir mit Klassen arbeiten bzw. OOP anwenden...
Na dann wirf mal cout aus deinem Programm raus.
Wenn deine Funktion NULL zurückgeben darf, darfst du eben den Rückgabewert nicht direkt ausgeben, sondern musst ihn zunächst in einer Variablen speichern.
-
Du musst die Rückgabe von strstr auf NULL prüfen.
-
Die Lösung von matze_ funktioniert... Vielen Dank
Gibt es vielleicht noch eine Erklärung dafür, wieso das so ist?
-
root2k schrieb:
Die Lösung von matze_ funktioniert... Vielen Dank
Gibt es vielleicht noch eine Erklärung dafür, wieso das so ist?Ich glaube, strlen(NULL) ist nicht so gut...

-
_matze schrieb:
root2k schrieb:
Die Lösung von matze_ funktioniert... Vielen Dank
Gibt es vielleicht noch eine Erklärung dafür, wieso das so ist?Ich glaube, strlen(NULL) ist nicht so gut...

Ach du scheiße, das ergibt sogar Sinn...

Manchmal sollt ich mir echt n Strick nehmen....
Danke

-
while ('\0' != Text[i] && '&' != Text[i]) { NewText[j] = Text[i]; i++; j++; }dafür gibts übrigens nen std::copy (aus dem algorithms header) ^^
char * NewText = new char [255]; /*...*/ return NewText;fällt dir was auf?
mir schon: das delete[] fehlt - geht auch schlecht, weil du das ergebnis ja brauchst... also musst du in deinem quelltext das delete noch nehmen -> stinkt alles, weil man das new nicht sieht aber trotzdem nen delete[] aufrufen muss...
also geht man idR den Weg über ne Release-Funktion, die das delete[] aufruft - hässlich ist es immernoch...
außerdem hast du die länge dort theoretischerweise schon - ist zwar ein wenig mehr arbeit, aber dafür geht es eben auch mit mehr als 254 zeichen und zudem wird nicht jedes mal ewig viel speicher für vll 20 zeichen angefordert...btw:
warum will dein lehrer kein std::string? soll aber schon C++ sein, was du dort lernst?zum eigtl programm/problem:
char * VarParse (char *const& Text, char *const& SearchTerm);hässlicher gehts au nimmer!? -.-
außerdem sollte das so auch gar net gehen!? Oo
char * VarParse (const char *Text, const char *SearchTerm);so sollte es (wenn man deinem quelltext glaubt) stimmen - allerdings wirst du wahrscheinlich den Zeiger auf Text verändern müssen (damit du beim zweiten mal parsen nicht noch mal das erste parst ^^) - also sowas:
char * VarParse (char *& Text, const char *SearchTerm);das hier meinte ich:
char* VarParse (char *& Text, const char *SearchTerm); int main() { char t[3]; t[0] = '0'; t[1] = '1'; t[2] = '\0'; char* aktuelle_pars_position = &t[0]; char* fertig = aktuelle_pars_position + strlen(aktuelle_pars_position); while (aktuelle_pars_position != fertig) { char *a = VarParse (aktuelle_pars_position, "asd"); std::cout << a; } } char * VarParse (char *& Text, const char *SearchTerm) { ++Text; //man kann Text ändern - und verändert damit den übergebenen zeiger nicht nur lokal (dafür ist ja das '&' da) return "asd"; }jz kann man auch endlich den ganzen string parsen ^^
jetzt haben wir nur noch das problem, dass das, was wir zurückgeben, bis jz statisch ist und deshalb noch das delete entfällt - so einfach wollen wir uns das aber ma nich machen:
normalerweise würd ich jz ja ne kleine klasse schreiben, die nur nen zeiger auf der erste und auf das letzte byte hält (da die ausgabe ja immer nen teil der eingabe ist und nicht verändert werden soll)- aber da du meintest ohne oop, wird das ein wenig schwer ^^
#include <algorithm> //std::copy //call ReleaseVarParse(char*) for releasing the memory char * VarParse (char *& Text, const char *SearchTerm) { /*strstr, ...*/ int length = 0; for (char *i(Text); *i != '\0'; ++i, ++length) { if(*i == '&') break; } char *returnval = new char[length+1]; std::copy(Text, Text+length, returnval); returnval[length] = '\0'; Text += length+1; return returnval; } void ReleaseVarParse (char *value) { delete[] value; } int main() { char* input = "variable1=variable1-inhalt&string=string-inhalt"; char* aktuelle_pars_position = input; char* fertig = aktuelle_pars_position + strlen(aktuelle_pars_position); while (aktuelle_pars_position != fertig) { char *a = VarParse (aktuelle_pars_position, "asd"); std::cout << a; ReleaseVarParse (a); } }alles andere, als hübsch, aber es funktioniert... so ganz ohne speicherlecks und so ^^
bb