Problem mit Stringrückgabe
-
Moin!
Wieso um alles in der welt gibt er nach dem return so einen Fu*k aus?
achtet erstmal gar nicht auf den sinn der funktion...
Eigentlich sollte er ja wieder den String "C:\\Mp3\\song.mp3" zurückgeben.
Ich komm nicht dahinter#include <iostream.h> #include <string.h> char * strrplc(char * string) { char outputstring[130]; int lenght = strlen(string); //cout << lenght << endl; for (int i=0, a=0; i<=lenght ; i++, a++) { if (string[i] != 92) outputstring[a] = string[i]; else { outputstring[a] = 92; outputstring[a+1] = 92; a++; } } cout << "Der Outputstring in der Funktion:\t" << outputstring << endl; return(outputstring); } int main() { cout << strrplc("C:\\Mp3\\song.mp3") << endl; return (0); }
[ Dieser Beitrag wurde am 22.04.2003 um 20:51 Uhr von Peter Piksa editiert. ]
-
Ganz einfach, du gibtst eine lokale Variable zurück. Das geht mit integern etc. aber nicht mit Strings die als Pointer behandelt werden. Sowas musst du schon per malloc/free oder new/delete machen.
Denn lokale Variablen werden auf dem Stack angelegt und der nächste Funktionsaufruf brezelt da munter drüber weg.
[ Dieser Beitrag wurde am 22.04.2003 um 20:59 Uhr von TriPhoenix editiert. ]
-
häää
wie per malloc?
wo muss ich denn da speicher bereitstellen?
-
Naja du musst das Ergebnis irgendwo speichern wo es nicht zerstört wird, also in einer globalen Variable (hässlich) oder in alloziiertem Speicher. Also anstatt deiner globalen Variable per malloc Speicher alloziieren und den Zeiger auf diesen dann zurückgeben. Den natürlich am Ende wieder freigeben.
-
#include <stdio.h> #include <string.h> char *strrplc(char *string, char *outputstring){ int lenght = strlen(string), a, i; for(i=0, a=0; i<=lenght ; i++, a++){ if (string[i] != 92){ outputstring[a] = string[i]; }else{ outputstring[a] = 92; outputstring[a+1] = 92; a++; } } printf("Der Outputstring in der Funktion:\t %s\n",outputstring); return outputstring; } int main(void){ char outputstring[130]; printf("%s\n",strrplc("C:\\Mp3\\song.mp3",outputstring)); return 0; }
Eigentlich hab ich das nur geschrieben, um eine Frage zum gcc loszuwerden :p :
warum meckert ("backslash.c:6: `for' loop initial declaration used outside C99 mode") der da?
-
Original erstellt von spitzenbleistift:
Eigentlich hab ich das nur geschrieben, um eine Frage zum gcc loszuwerden :p :
warum meckert ("backslash.c:6: `for' loop initial declaration used outside C99 mode") der da?Weil im echten C so eine for-Schleife (for (int i...) nicht stehen darf. In C geht das erst seit C99 oder halt in C++. Also musst du die Datei in .cpp umbenennen oder deinen gcc mit dem Schalter -std=c99 aufrufen.
-
warum verwendet der gcc nicht automatisch den c99 standard?
-
You ok dankeschön für die Hilfe, habe es jetzt hinbekommen.
Ist die Lösung so einigemassen akzeptabel?#include <iostream.h> #include <string.h> #include <stdlib.h> char * strrplc(char * string) { int i, a; int lenght = strlen(string); int slashcount = 0; for(i = 0 ; i<=lenght ; i++) { if (string[i] == 92) slashcount++; } char *outputstring = (char*)malloc(sizeof(char)*slashcount); for (a=0, i=0; i<=lenght ; i++, a++) { if (string[i] != 92) outputstring[a] = string[i]; else { outputstring[a] = 92; outputstring[a+1] = 92; a++; } } cout << "Der Outputstring in der Funktion:\t" << outputstring << endl; return(&outputstring[0]); } int main() { cout << strrplc("C:\\Mp3\\song.mp3")<<endl; retur
-
Original erstellt von spitzenbleistift:
warum verwendet der gcc nicht automatisch den c99 standard?Warum sollte er. Damit riskiert man höchstens, dass alter Sourcecode der eventuell mtii C99 nicht mehr läuft (kenne den Standard leider nicht genau genug dafür) nicht mehr läuft, denn der Compielr heißt ja nach wie vor gcc. Deswegen hat man lieber einen Schalter dafür geschaffen.
-
Original erstellt von Peter Piksa:
**You ok dankeschön für die Hilfe, habe es jetzt hinbekommen.
Ist die Lösung so einigemassen akzeptabel?
**Fast Du musst den Speicher in der main-Funktion noch wieder freigeben.
-
wie mach ichn das??
-
Original erstellt von Peter Piksa:
wie mach ichn das??char *foo = strrplc("C:\\Mp3\\song.mp3"); cout << foo << endl; free(foo);
-
kann ich "free(outputstring);" in der funktion nach dem return machen?
-
Original erstellt von Peter Piksa:
kann ich "free(outputstring);" in der funktion nach dem return machen?Nein, dann wäre der String ja schonwieder ungültig bevor er verwendet wird. Und genau das soll ja vermieden werden.
-
*grummel* mensch is ja kagge.
dann könnte ich die funktion ja gar nicht woanders benutzen.
weil dann müsste ich ja merken dass ich immer wenn ich diese funktion benutze ein free dahinter machen muss
kann man das nicht auch anders lösen?ausserdem:
wenn ich das im main mache kommt: error C2065: 'outputstring' : nichtdeklarierter Bezeichner
[ Dieser Beitrag wurde am 22.04.2003 um 23:03 Uhr von Peter Piksa editiert. ]
-
Original erstellt von TriPhoenix:
Warum sollte er. Damit riskiert man höchstens, dass alter Sourcecode der eventuell mtii C99 nicht mehr läuft (kenne den Standard leider nicht genau genug dafür) nicht mehr läuft, denn der Compielr heißt ja nach wie vor gcc. Deswegen hat man lieber einen Schalter dafür geschaffen.ihmo ist C99 voll abwaertskompatibel. das sollte also kein grund sein.
-
Original erstellt von Peter Piksa:
***grummel* mensch is ja kagge.
dann könnte ich die funktion ja gar nicht woanders benutzen.
weil dann müsste ich ja merken dass ich immer wenn ich diese funktion benutze ein free dahinter machen muss
kann man das nicht auch anders lösen?
**Wahlweise mit ner globalen Variable oder einer eigenen Zeigerverwaltung die sich drum kümmert
**
wenn ich das im main mache kommt: error C2065: 'outputstring' : nichtdeklarierter Bezeichner
**Klar, du musst es ja auch zwischenspeichern. Also wie ich oben gepostet hatte.
-
Original erstellt von TriPhoenix:
Wahlweise mit ner globalen Variable oder einer eigenen Zeigerverwaltung die sich drum kümmert*staun* was istn das? *wissenwill*
das zwischenspeichern ist doch in der funktion selbst.
und in der funktion kann ich ja nicht free machen.
und im main nicht weils da unbekannt ist.[ Dieser Beitrag wurde am 22.04.2003 um 23:22 Uhr von Peter Piksa editiert. ]
-
Original erstellt von Peter Piksa:
***staun* was istn das? *wissenwill*
**Naja, man kann sogenannte SmartPointer schreiben, Zeiger die sich selbst freigeben wenn sie nicht mehr gebraucht werden. Oder eine Funktion die jedes malloc notiert und bei nicht mehr gebruachten Werten irgendwie die Dinge wieder freigibt. Ist aber alles ein bisschen Overkill für das was du willst
**
das zwischenspeichern ist doch in der funktion selbst.
und in der funktion kann ich ja nicht free machen.
und im main nicht weils da unbekannt ist.
**Nein das zwischenspeichern soll gerade in der main sein. Die Main-Funktion soll so aussehen:
int main() { char *rueckgabe = strrplc("C:\\Mp3\\song.mp3"); cout << rueckgabe << endl; free(rueckgabe); return (0); }
PS: ich habe inzwischen gesehen, dass spitzenbleistift in seiner GCC-frage auch noch ne nette Variante gebaut hat.
-
Jetzt versteh ich aber auch nicht mehr wirklich was...
Bin grade bei diesem code hier.
der macht keine fehler beim linken/compilieren aber wenn man das prog ausführt, kratzt er ab....#include <iostream.h> #include <string.h> #include <stdlib.h> char * strrplc(char * string) { int i, a; int lenght = strlen(string); int slashcount = 0; for(i = 0 ; i<=lenght ; i++) { if (string[i] == 92) slashcount++; } char *outputstring = (char*)malloc(sizeof(char)*slashcount); for (a=0, i=0; i<=lenght ; i++, a++) { if (string[i] != 92) outputstring[a] = string[i]; else { outputstring[a] = 92; outputstring[a+1] = 92; a++; } } cout << "Der Outputstring in der Funktion:\t" << outputstring << endl; return(outputstring); } int main() { char *outputstring = strrplc("C:\\Mp3\\song.mp3"); cout << outputstring<<endl; free(outputstring); return (0); }