Programmieren - alles kontrollieren 4.941 Themen, 20.712 Beiträge

String als Rückgabewert einer Funktion (C)

vesala / 6 Antworten / Baumansicht Nickles

nabend,


ist es möglich einen string(z.B: char feld[20];) als rückgabewert zurückzugeben?
also return feld;


wenn ja wie definiere ich dann die Funktion, habe bis jetzt nur Zeiger auf globalen String oder einen einzelnen char hinbekommen->welches mir beides nix nützt


THX Vesala

bei Antwort benachrichtigen
thomas woelfer vesala „String als Rückgabewert einer Funktion (C)“
Optionen

im normalfall wirst du kein array zurueckliefern wollen, sondern einen zeiger auf einen char. (char *). das schreibt man genau so hin wie man das erwarten wuerde...

char* func();

ich habe aber das gefuehl das das gar nicht das problem ist das du hast... warum lieferst du z.b. einen zeiger auf einen globalen string ?

WM_HOPETHISHELPS

this posting contains no tpyos.
bei Antwort benachrichtigen
vesala Nachtrag zu: „String als Rückgabewert einer Funktion (C)“
Optionen

die funktion macht folgendes:
sie holt aus einer Textdatei eine bestimmt Zeile und soll diese zurück geben, bisher lief das so

char* holeZeile(int ZeilenNr)

in der Funktion wurde dann der ausgelesene String in eine globale Variable(char array) geschrieben, und der Zeiger auf dieses Array zurückgegeben.

Nun habe ich aber folgendes Problem:
ich rufe diese Funktion 2mal direkt hintereinander auf
zb: Popup(holeZeile(1),holeZeile(2));
in Zeile1 steht die Überschrift des Popups
in Zeile2 steht der Popuptext
dies funktioniert so natürlich nicht da der 2te Aufruf der holeZeile Funktion natürlich den Wert des 1ten Aufrufs überschreibt :-(

deswegen dachte ich mir geb ich doch einfach direkt nen string zurück,
aber der compiler wollte mein Problem auch nach langem zureden nicht verstehen ;-)

Problem erkannt?
THX Vesala

bei Antwort benachrichtigen
mr.escape vesala „die funktion macht folgendes: sie holt aus einer Textdatei eine bestimmt Zeile...“
Optionen

Man könnte z.b. CString (mfc) benutzen, oder aber "zirkulierende" statische puffer. Nicht gerade elegant, aber wirkungsvoll. Die rückgabe von neu allokierten speicherbereichen bringt hingegen nur stress mit memory leaks, solange nicht eine klasse, wie bei CString darüber wacht. Sich mit der mfc ins bett zu legen, wenn man noch ohne sie auskommt, sollte man sich auch mehrfach überlegen.

#define MAX_CALLS 5  //anzahl maximaler "gleichzeitiger" aufrufe

char buff[MAX_CALLS][1024];
char* holeZeile(int ZeilenNr){
static n=0;
n=(n+1)%MAX_CALLS;
//fülle buff[n] z.b.:
sprintf(buff[n], "[%d]", ZeilenNr);
return buff[n];
}


ruft man dann z.b. in der konsole:
printf(":%s:%s:%s:%s:%s:\n", holeZeile(1), holeZeile(3), holeZeile(5), holeZeile(7), holeZeile(9));

auf, gibt es
:[1]:[3]:[5]:[7]:[9]:

zu sehen.

mr.escape
"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
thomas woelfer vesala „die funktion macht folgendes: sie holt aus einer Textdatei eine bestimmt Zeile...“
Optionen

ich denke das dine hauptsaechliches problem daraus bestehen wird das deine holezeile funktion in einen puffer lesen wird und du dann einen zeiger auf diesen puffer lieferts. ungefaehr so:

char* holezeile( int z)
{
char buf[1024];
// ... blabal
return buf;

}

das problem dabei ist das der speicher von buf auf dem stack liegt und nicht mehr verfuegbar ist wenn holezeile terminiert. du musst den speicher allozieren auf den du den zeiger lieferst...

char* holezeile( int z)
{
char buf[1024]
// blabla.. text steht in buf

char* p = (char*)malloc(strlen(buf)+1);
strcpy( // aus buf nach p
return p;
}

WM_HOPETHISHELPS

this posting contains no tpyos.
bei Antwort benachrichtigen
vesala Nachtrag zu: „String als Rückgabewert einer Funktion (C)“
Optionen

danke leute gelich mal probieren :-)

bei Antwort benachrichtigen
vesala Nachtrag zu: „String als Rückgabewert einer Funktion (C)“
Optionen

THX @ thomas woelfer + mr.escape

die Version von mr.escape funktioniert wunderbar, werden euch beide in meiner Belegarbeit lobend erwähnen.

CYA Vesala

bei Antwort benachrichtigen