In der Funktion noch richtige Ausgabe, beim wiederkehr in die Datei nur noch Dreck! (Pointer)
-
Juhu, ich habe 2 Datein, eine Header Datei, in der eine Funktion gespeichert ist und die einen Pointer auf einen string wiedergibt. Die andere soll diesen pointer benutzen, doch wenn ich dann in der main mir das ausgeben lasse, was beim Pointer steht, ist nur noch dreck zu sehen (in der Funktin selbst nicht) sprich unformatierter Speicher, einfach nur komische Zeichen. Nur über den Ausdruck *(pointer + 0...) bekomme ich rückgabewerte, aber da auch nur zeichenweise.
die Headerdatei:
char* getIkIp(char); //filtert die IP raus char* getIkIp(char *urlFilter) { char urlChar[30]; // hier steht nachher nur die IP drin. int y; y = 7; // http:// = 7 zeichen for(int x = 0;x < 30;x++) { urlChar[x] = urlFilter[y]; y++; } urlChar[29] = '\0'; char Sstring[] = "/"; char *pString; int posEnd; pString = strstr(urlChar,Sstring); posEnd = pString - urlChar; char postString[20]; for (x = 0;x < posEnd;x++) { postString[x] = urlChar[x]; } char* urlIP; postString[x] = '\0'; urlIP = postString; // wenn ich hier cout << urlIP; mache, stimmt alles return urlIP; }
und die main datei. (steht in der main)
int main() { . . . char *serverIp; serverIp = getIkIp(loginUrl); // holt die IP# // wenn ich hier cout << serverIp; mache steht nur dreck da. . . . }
-
Benutze std::string für Zeichenketten. Da sollte es solche Probleme nicht geben.
Dein Problem ist, dass postString nach dem Verlassen der Funktion nicht mehr existiert und damit der Pointer urlIP auf keinen gültigen String mehr zeigt.
-
sowie ich es sehe fehlt die 0 Terminierung.
mir ist es letztens auch passiert.
int lang=strlen(PostString); urlIP=new char[lang+1]; strcpy(urlIP,PostString);
So sollte klappen.
-
problem bei der terminierung: ich lade das mit new ja in den heap speicher, so hatte ich es vorher und bin gerade dabei diese Fehler wieder zu berichtigen, weil ich auf einmal alles im Heap hatte und seltsame Fehler traten auf (speicherlöcher), ich konnte die heap elemente leider aber nicht mit delete löschen, von daher schließt die new variante leider aus.
-
warum denn die definition in der header? ich würde sie in ne .cpp-datei packen.
-
Wenn Du nicht mit new arbeiten willst, dann wirste wohl auf std::string umsteigen müssen, denn das was Du da vor hast geht so nicht. Es fehlt nicht nur die Terminierung, sondern Du gibst, wie oben schon erwähnt einen Zeiger auf ein lokales Objekt zurück. Gib std::string mal ne Chance, ist wirklich einfach zu benutzen. Ich schätze mal damit wird Deine Funktion nur etwa halb so lang.
MfG Jester