hawkeye78 Geschrieben 14. August 2005 Teilen Geschrieben 14. August 2005 Hallo, ich weiß zwar das das meine Ausbildung nicht gerade Rühmt aber ich hänge im bereits dem gesamten Nachmittag bei einem kleinen Programm, in welchem ich eigentlich nur eine Zeichenkette an die aufrufende Funktion zurück geben möchte. Ich habe mir zwar bis jetzt folgenden Quellcode zusammen gesponnen aber dieser Funktioniert leider weder in dieser Version noch in der Version das ich nicht direkt die Zeichenkette zurückgeben sondern über eine Variable. #include <stdio.h> #include <conio.h> char rueck(void) { return("Hallo Welt"); } void main(void) { char Zeichen[10]; Zeichen=rueck(); printf("%s",Zeichen); } Da ich mich nun gut 2 Jahre mit C nicht mehr näher beschäftigt habe wäre ich über einen kleinen Hinweis wie ich die Zeichenkette doch zurück gegeben komme sehr dankbar. Viele Grüsse Dan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
nic_power Geschrieben 14. August 2005 Teilen Geschrieben 14. August 2005 Hallo, Du musst mit pointern arbeiten, da Du in C Strings nicht direkt zurückgeben kannst: char *myString() { return "hello world\n"; } int main() { char *str=myString(); printf("%s", str); } [/php] Nic Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 15. August 2005 Teilen Geschrieben 15. August 2005 wäre ich über einen kleinen Hinweis wie ich die Zeichenkette doch zurück gegeben komme sehr dankbar. So einfach gar nicht. Der einzige generell funktionsfähige Weg besteht darin, an die Funktion rueck() einen Zeiger auf einen Speicherbereich zu übergeben, der groß genug sein muss, um den C-String aufzunehmen. Die Funktion rueck() kann dann den Buffer mit einem beliebigen String füllen. Andere Lösungswege haben die in oder anderen Limitierungen/Probleme: Wenn Du an rueck keinen Zeiger übergeben willst, könntest Du einen festen Speicherbereich einrichten, den rueck() bei jedem Aufruf füllt. Als Komfort kann rueck() dann auch einen Zeiger auf diesen Bereich zurückliefern. Der Nachteil ist, das der Buffer bei jedem Aufruf von rueck() erneu verwendet wird (=überschrieben). Das Beispielprogramm von nic_power ist mit Vorsicht zu genießen: Es funktioniert zwar, liefert aber immer einen Zeiger auf eine (die gleiche) konstante Zeichenkette zurück. Wenn die Zeichenkette dynamisch erstellt werden soll geht es leider nicht so einfach. Wenn Du C++ verwenden würdest, könntest Du einfach ein std::string Objekt zurückgeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 15. August 2005 Teilen Geschrieben 15. August 2005 Was mir grade noch einfällt: Deine Funktion könnte mit malloc() einen Speicherbereich reservieren und dort hinein den C-String schreiben. Dann kann dann einen Zeiger auf den Speicherbereich zurückgeben werden. Allerdings muss die aufrufende Funktion (also die Funktion, die den String erhält) den Speicher irgendwann mit free() selbst freigeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
nic_power Geschrieben 15. August 2005 Teilen Geschrieben 15. August 2005 Hallo, Das Beispielprogramm von nic_power ist mit Vorsicht zu genießen: Es funktioniert zwar, liefert aber immer einen Zeiger auf eine (die gleiche) konstante Zeichenkette zurück. Das war ja auch so gewünscht. Das Programm bildet genau die Funktionalität nach, die in der Ursprungsfrage verlangt wurde. Nic Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 15. August 2005 Teilen Geschrieben 15. August 2005 Das war ja auch so gewünscht. Das Programm bildet genau die Funktionalität nach, die in der Ursprungsfrage verlangt wurde. [...] aber dieser Funktioniert leider weder in dieser Version noch in der Version das ich nicht direkt die Zeichenkette zurückgeben sondern über eine Variable. Ein Hinweis, dass das so nur mit Literalen funktioniert und ein Zeiger auf const char als Rückgabewert wären IMHO angebracht gewesen. Aber ansonsten ist ja alles gesagt worden. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hawkeye78 Geschrieben 15. August 2005 Autor Teilen Geschrieben 15. August 2005 Hallo, zunächst einmal möchte ich mich für die vielen Postings bedanken, ich habe den Quellcode mittlerweile auch so zum laufen bekomme. Allerdings habe ich nun den Quellcode auch ein klein umgeschrieben und bekomme zwar ein lauffähiges Programm, aber im moment hängt das Programm noch irgendwelche kryptischen Zeichen an die Ausgabe. Ich habe zwar die Vermutung das liegt liegt an der Tatsache das ich mit dem String nicht das gesamte Array abdecke. Aber leider habe ich keine Ahnung wie ich dieses Abstellen könnte. #include <stdio.h> #include <string.h> #include <conio.h> char *myString() { char ausgabe[15]; char *zeiger; strncpy(ausgabe,"HalloWelt",15); zeiger=ausgabe; printf("%s",ausgabe); return(zeiger); } int main() { char *str=myString(); printf("%s", str); getch(); } [/PHP] Ich wäre daher über einen kleinen weiteren Hinweis wie ich dieses Problem beseitigen kann dankbar. Viele Grüsse Dan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 15. August 2005 Teilen Geschrieben 15. August 2005 Nein, das liegt woanders dran. Wenn du in myString deinen String ausgibst erhältst du ja die richtige Ausgabe nur in der main Funktion plötzlich nicht mehr. Das hat den Grund das dein String ausgabe eine lokale Variable in deiner myString Funktion ist. Mit return(zeiger) (was übrigens das Selbe wie return(ausgabe) ist) lieferst du einen Zeiger auf einen lokalen Speicherbereich. Dieser Speicher wird aber nach verlassen der myString Funktion wieder freigegeben und kann somit zufällig von anderen Programmen überschrieben werden. Wenn ich bei mir im VC++ übrigens return(ausgabe) anstatt return(zeiger) schreibe bekomme ich eine dem entsprechende Warnung: Adresse einer lokalen Variablen oder eines temporaeren Wertes wird zurueckgegeben Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
hawkeye78 Geschrieben 15. August 2005 Autor Teilen Geschrieben 15. August 2005 Hallo Guybrush, erst einmal möchte ich mich für dein Posting bedanken, und ja die Fehlermeldung mit der lokalen Variable bekomme ich auch, wenn ich statt "return(zeiger)", return(ausgabe) schreiben. Allerdings habe ich ein klein wenig gehofft ich könnte über den Umweg mit dem Zeiger vermeiden globale Variabeln zu deklarieren... Viele Grüsse Dan Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 16. August 2005 Teilen Geschrieben 16. August 2005 Ich habe Dir ein kleines Beispiel aufgeschrieben, vielleicht hilft Dir das mehr. Aber achte beim Verwenden der Vorgehensweise in eigenen Programmen unbedingt darauf den Speicher wieder freizugeben! Das Beispiel erzeugt einen String, der bis zu z Buchstaben des Alphabets enthält. #include <stdio.h> #include <malloc.h> char *ErzeugeAlphabetString(int z) { int x; char *cstr = NULL; /* Fülle den String mit den ersten z Zeichen des Alphabets: (Ein Alphabet-String enthält mindestens ein bis maximal 26 Zeichen.)*/ if(z>0 && z<=26) { /* Speicher reservieren. Die Größe beträgt z (Anzahl der Zeichen) plus 1 (0-Byte, welches das Ende von C-Strings signalisiert) */ cstr = (char *) malloc(sizeof(char)*(z+1)); /* String füllen: */ cstr[0]='A'; for(x=1;x<z;x++) cstr[x] = cstr[x-1]+1; /* 0-Byte setzen: */ cstr[z]=0; } /* Zeiger auf den Speicherbereich mit dem C-String zurückgeben: */ return cstr; } int main(int argc, char* argv[]) { char *text; text = ErzeugeAlphabetString(26); printf("Der erzeugte String lautet: %s\n",text); free(text); /* <--- Wichtig! Der Speicher muss manuell freigegeben werden! */ text = ErzeugeAlphabetString(12); printf("Der erzeugte String lautet: %s\n",text); free(text); /* <--- Wichtig! Der Speicher muss manuell freigegeben werden! */ return 0; } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.