frage zu funktionen mit unterschiedlichen rückgabewerten



  • hallo,

    ich bin gerade dabei mir c beizubringen, hänge aber im moment ein wenig durch, da mir folgendes code beispiel kopfschmerzen bereitet, bzw. ich nicht verstehe, was ich tun muss, damit es funktioniert.

    #include <stdio.h>
    
    char getmessage(){
    	char n[200];
    	printf("\nBitte Nachricht eingeben: \n");
    	scanf("%c",&n);
    	return n;
    }
    
    int main ()
    {	
    	char m[200];
    	m = getmessage();
    	printf("\n%s",*m);
    	return 0;
    }
    

    folgende fehlermeldung bekommen ich vom compiler:

    test.c: In function 'getmessage':
    test.c:7: warning: return makes integer from pointer without a cast
    test.c:7: warning: function returns address of local variable
    test.c: In function 'main':
    test.c:13: error: incompatible types in assignment
    

    main soll einfach die funktion gemessage() aufrufen, da soll eine nachricht eingegeben werden und dieso soll dann ausgegeben werden.

    was mach ich falsch, muss ich irgendwas casten?? oder ist char der falsche rückgabewert für getmessage()?



  • getchar soll ein 'char' (sprich ein Zeichen) zurückgeben. Mit return n; gibst du einen Zeiger auf ein Array zurück. Das kann natürlich nicht gehen. Also du weißt, wo du etwas verändern muss.

    Btw: es ist keine gute Idee, Zeiger auf lokale Variable zurückzugeben, denn sie sind ungültig, wenn die Funktion beendet hat.



  • und welchen datentyp soll ich dann für getmessage() wählen?



  • alex1986 schrieb:

    und welchen datentyp soll ich dann für getmessage() wählen?

    char*

    Aber wie ich bereits erwähnt habe: es ist keine gute Idee, Zeiger auf lokale Variable zurückzugeben, denn sie sind ungültig, wenn die Funktion beendet hat.

    edit: entweder reservierst du den Speicher mit man: malloc(3) oder du bekommst einen Zeiger als Parameter.



  • okay, also wäre es sinnvoller das array in der main-fkt zu definieren und der getmessage()-fkt einfach den zeiger auf das array zu übergeben?



  • alex1986 schrieb:

    okay, also wäre es sinnvoller das array in der main-fkt zu definieren und der getmessage()-fkt einfach den zeiger auf das array zu übergeben?

    ja, das ist eine gute Idee. Viele Funktionen im Standard machen genau das.



  • okay, habe das jetzt meiner meinung nach so geändert wie es sein müsste, wird auch richtig kompiliert, aber die ausgabe funktioniert nich, ich denke ich hab da irgendwo nen fehler drin, aber weiß nich genau wo:

    #include <stdio.h>
    
    void getmessage(char* ein){
    	printf("Bitte Nachricht eingeben: \n");
    	scanf("%c",&ein);
    }
    
    int main ()
    {	
    	char* m;
    	getmessage(m);
    	printf("%s",m);
    	return 0;
    }
    

    bei der ausgabe mit printf kommt nur wirwarr auf der konsole bei raus.



  • 1. Du reservierst keinen Speicher auf den m zeigt.
    2. %c liest ein Zeichen, nicht aber eine Zeichenkette.
    3. Der Adressoperator beim scanf() ist falsch, da ein bereits ein Zeiger ist.
    4. Zum einlesen von Strings ist fgets() besser geeignet als scanf().
    5. Es würde sich prinzipiell bieten neben dem Zeiger auch noch die Größe des hinter dem Zeiger liegenden Speicherbereichs zu übergeben.


Anmelden zum Antworten