String aus funktion zurückgeben
-
Hallo habe erst vor kurzem wegen meinem Studium mit dem Programmieren angefange und habe noch nicht so viel Ahnung als nehmt bitte Rücksicht
Die Aufgabenstellung lautete folgendermaßen:
"Schreiben Sie eine Funktion, die ein Wort
vom Typ String als Parameter erh¨alt und die Zeichen
dieses Wortes in umgekehrter Reihenfolge speichert.Schreiben Sie eine main()-Funktion die das
Wort einliest, die Funktion aufruft und das neue
Wort ausgibt."Mein (leider nicht funktionierendes) Programm schaut folgendermaßen aus:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define max 50 char inverter(char s1[]) { int i,d, laenge = strlen(s1); char s2[laenge]; for (i = laenge - 1, d = 0; i >= 0; i--, d++) s2[d] = s1[i]; return s2; } int main() { char s1[max]; printf("Bitte geben sie ein Wort ein!\n"); fgets(s1, max, stdin); printf("%s",inverter(s1)); return 0; }
Ich verstehe einfach nicht was ich falsch mache. Hab gehofft jmd kann mir hier helfen.
-
roflrudi schrieb:
Mein (leider nicht funktionierendes) Programm schaut folgendermaßen aus:
"Funktioniert leider nicht" ist keine Fehlerbeschreibung. Was funktioniert nicht? Was sagt dein Compiler (welcher?) dazu; bekommst du Fehler und/oder Warnungen? Sollte das Programm kompilieren ... was für ein Verhalten erwartest du bei welcher Eingabe? Das passiert entgegen deiner Erwartung?
-
Sry ich hab mich wohl unklar ausgedrückt
Mir werden folgende Fehlermeldungen angzeigt:
11 [Warning] return makes integer from pointer without a cast
11 [Warning] function returns address of local variableDas Programm startet, ich geben ein Wort ein, drücke Enter und dann hängt sich das Programm auf.
Ich verstehe nicht was gemeint ist mit den Fehlermeldungen oder wie ich sie beheben kann.
-
- du gibst lokalen Speicher deiner Funktion an main zurück; dieser ist nicht mehr gültig nach Funktionsaufruf in main, d.h. UB
- du benutzt grundlos VLA
- "max" benennt man KEINE globale Konstante
- fgets liefert meist endendes '\n' am String, das du auch mit umkehrst
- fgets liefert nicht "ein Wort" wie verlangt sondern u.U. mehrere Wörter im String
- char ist falscher return-Typ, Zeiger auf char wäre richtig
-
roflrudi schrieb:
11 [Warning] return makes integer from pointer without a cast
11 [Warning] function returns address of local variable[...]
Ich verstehe nicht was gemeint ist mit den Fehlermeldungen oder wie ich sie beheben kann.
Beide beziehen sich auf Zeile 11:
return s2;
s2
ist bei dir ein funktionslokales Array, das nach Ende der Funktion garnichtmehr existiert. Es macht daher keinen Sinn, es (bzw. da ein Array in einen Pointer zerfällt: einen Pointer darauf) zurückzugeben, da der Aufrufer deiner Funktioninverter()
damit sowieso nichts anfangen kann (und darf!).
Weiters gibt deine Funktioninverter()
etwas vom Typchar
zurück, ein Typ für ein Zeichen. Dein Compiler sieht aber beimreturn
, daß du einenPointer to char
(in das zerfällt dein Array) zurückgibst, muss den zwangsweise aber in den Rückgabetypchar
stopfen, und warnt dich davor (return makes integer from pointer without a cast), weil du das mit ziemlicher Sicherheit nicht willst.// edit: meingott, bin ich laangsam
-
ok den ersten Fehler verstehe ich und weis auch wie ich ihn beheben kann.
Aber ich verstehe nicht wie ich den zweiten beheben soll
-
Drei Möglichkeiten:
s1
direkt in sich selbst umdreheninverter()
als weiteren Parameter einen Zeiger auf den Bereich zum schreiben geben- in
inverter()
Speicher fürs2
dynamisch anfordern
-
ups jetzt hast mich falsch verstanden
ich meinte den anderen fehler den ich nicht verstehe
also:
11 [Warning] return makes integer from pointer without a castdas mit der lokalen variable verstehe ich
-
Du machst sinngemäß
char foo( void ) { char * ptr = 42; return ptr; }
In Zeile vier muss also ein
char*
in einenchar
umgewandelt werden. Davor wirst du gewarnt.
-
Und den Terminator '\0' hast du auch vergessen.
Sowohl den Platz dafür, als auch ihn zu schreiben.
-
Mit return s2 gibst du in wirklichkeit einen Zeiger auf das erste Element des Arrays zurück.Der Compiler meckert,weil du bei deiner Funktion den Rückgabewert char und nicht char * angegeben hast.
Mal eine andere Frage an alle hier,wieso kann der Thread Ersteller die größe des Arrays mithilfe einer Funktion ermitteln
laenge = strlen(s1); char s2[laenge];
Muss bei einem Array nicht ein konstanter Wert/Ausdruck zur Angabe der Größe verwendet werden?
-
Das sind VLA, deren Größe erst zu Laufzeit feststeht. Außerdem ist die Länge hier um 1 zu klein.
-
Das nennt sich Variable Length Array (kurz VLA) und ist seit C99 im Standard.
Mit C11 wurde es aber teilweise zurückgenommen. Es ist kein Muss mehr.
-
Ich danke euch.