Zum Inhalt springen

String aus C-Funktion zurückgeben


hawkeye78

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...