String aus Funktion zurückgeben

Hallo zusammen,

ich habe ein Problem: Ich versuche aus einer Funktion einen String zurückzugeben. Das klappt aber irgendwie nicht ganz. Wenn ich den string und die Funktion als Array deklarieren will (char x[10]) dann sagt Borland mir sofort, daß Funktionen keine Arrays zurückgeben können. Wenn ich beides als Pointer deklariere (char *x) dann sieht das auf den ersten Blick gut aus. Allerdings kriege ich nur die ersten 3 Zeichen der Funktion zurückgeliefert, obwohl die Funktion sonst sauber funktioniert. D.h. die Funktion generiert mir z.B. den String ‚ABCDEFGHIJ‘, aber sobald ich das zurückgeben lasse kommt nur noch ‚ABC‘ an. Hat da einer ne Idee oder eine Lösung (achja: ich muss das ganze in einer Funktion haben, weil ich das in eine DLL packen will, die mir den String als Rückgabe liefert)?

–> gekürzter Code:

#include 
#include 

char \*Funktion(char[50],char[10]);

main ()
 {
 char x[50],y[10];
 cin\>\>x;
 cin\>\>y;
 cout

Was du da machst ist absolut fatal. Du darfst nicht einen Pointer auf einen Speicherbereich zurückgeben, der in der Funktion lokal allokiert wird. Sobald deine Funktion beendet wird, ist der Speicher freigegeben, was dann passiert ist undefiniert. Entweder du gibst der Funktion ein Array rein und schreibst dort rein oder du tust es dynamisch (mit malloc() oder new in c++) erzeugen (und später wieder löschen), aber so geht das auf keinen Fall.

Grüße
Bruno

Hallo turbopasqual,

Lies einmal den Artikel
„Array aus Funktion dem main-Prgramm übergeben“
ist der letzte Artikel in diesem Brett (teilweise schon im Archiv zu finden), da wird dein Problem beschrieben und erklärt.

MfG Peter(TOO)

Hallo,

also ich wuerde 2 Moeglichkeiten vorschlagen.
Die erste waere ueber die Rueckgabe eine string-Objektes und
die zweite Moeglichkeit waere die mit einem einfachen char-Array in der Paramater-Liste der Funktion:

string class::method(void)
{
 string oStr;
 // TODO: oStr belegen
 return(oStr);
}

Wenn oStr z.B. das lokale Objekt der klasse std::string ist, so ist ein Assignment und copy-Konstruktor mit Sicherheit vorhanden. Bei return(oStr) wird erst ueber den Copy-Kontruktor eine Kopie gezogen und zurückgeben. Dann wird der Destruktor von oStr beim Verlassen der methode aufgerufen. Ausserhalb der methode wirkt danach der Assignment-Operator der Klasse std::string. string kann hier der STL String sein, der MFC CString oder jeder andere String Klasse.

Willst Du es nur mit einem einfachen char-Array machen, so musst du es ueber die Paramater-Liste der Methode oder Funktion machen.

void class::method(char \*p\_pcBuf, unsigned p\_uiLen)
{
 // TODO: char Buffer der Laenge Len belegen
}

Der char-Buffer mit Laenge p_uiLen und Kopie den Pointers p_pcBuf aud den Anfang des Speicherbereiches wird selbstverstaendlich ausserhalb der Funktion oder Methode allokiert.

Die erste Moeglichkeit ist einfach und sicher, aber langsam (aber nur im Vergleich zur zweiten Moeglichkeit), da eine Kaskade von Konstruktor und Destruktor aufgerufen wird.
Zweite Moeglichkeit ist im Vergleich dazu schneller, aber fehleranfaelliger (Buffer-overflow, MemoryLeaks,…).

Cu

Hi !

Naja, der Bruno hat schon recht ! Aber als Ausnahme könnte man es doch auch so machen, oder ?

void main()
{

cout

Hallo,

Bruno hat den Fehler schon genannt: Ein C-String ist ja nichts anderes als ein Zeiger auf einen Speicherbereich der dann Zeichen enthält. Legst Du so einen statisch an, so lebt er nur solange die Funktion läuft. Danach können schlimme Sachen passieren! Du müßtest also wirklich mit malloc() arbeiten, wie Bruno schon gesagt hat.

Ich würde allerdings der Empfehlung von Bjarne Stroustrup (der Erfinder von C++ !) folgen und den Datentyp string aus der STL verwenden. Damit umgehst Du diese lästige Zeigerproblematik. Denn solche subtilen Fehlerchen werden immer wieder auftauchen und oftmals noch viel schwerer zu finden sein. Also: BENUTZE STRINGS! Diese kannst Du bei Bedarf auch wieder in C-Strings (also char*) umwandeln: DeinString.c_str()

Ich hoffe, das hilft.

Matthias Orgler

Hallo,

danke für die vielen Antworten. Jetzt hab ich´s endlich. Ein Beispiel wäre trotzdem schön gewesen:

#include

string Test(int Input)
{
if (Input>3)
return „groesser“;
else
return „kleiner“;
}

(So in der Art, aber Beispiele sagen meist mehr als tausend Worte)
Trotzdem Danke,
Turbopasqual