brauche kleine unterstützung bei strukt mit pointer übergabe



  • könnte mir bitte jemand sagen was ich falsch mache ? 🙂

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    
    void f1(struct person *);
    
    struct person{
    	char name[20]; 
    	char firstname[20]; 
    	char birthday[11];
    };
    
    void f1(struct person *übergabe)
    {
    
    		printf("Bitte geben sie den Namen von Person 1 ein:\n");
    		scanf("%c",&übergabe->name);
    
    }
    
    int main(void){
    
    	struct person aPer, *übergabe;
    	übergabe = &aPer;
    
    	f1(übergabe);
    	printf("Namen von Person 1: %c\n", aPer.name);
    
    	_getch();
    	return EXIT_SUCCESS;
    
    }
    


  • Deutsche Umlaute sind schlecht im C Quellcode.
    Zu char[] gehört der Formatspezifizierer "%s" (und nicht "%c").

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct person{
        char name[20];
        char firstname[20];
        char birthday[11];
    };
    
    void f1(struct person *uebergabe)
    {
    
            printf("Bitte geben sie den Namen von Person 1 ein:\n");
            scanf("%s",uebergabe->name);
    
    }
    
    int main(void){
    
        struct person aPer, *uebergabe;
        uebergabe = &aPer;
    
        f1(uebergabe);
        printf("Namen von Person 1: %s\n", aPer.name);
    
        return EXIT_SUCCESS;
    
    }
    


  • Bei Arrays ist es wie bei Zeigern - der Name steht schon für die Adresse. Dereferenzierungen kannst du mit * oder [Index] erreichen.

    char name[20] ist ein Array von 19 Buchstaben und einem Terminierungszeichen. name beschreibt die Anfangsadresse des Elements, name[5] allerdings den Wert im fünften Element.

    Mit übergabe->name übergibst du bereits die Adresse des Elements, die Verwendung des &-Operators ist nicht nötig.



  • Der aus dem Westen ... schrieb:

    char name[20] ist ein Array von 19 Buchstaben und einem Terminierungszeichen.

    ...wenn man es als String verwendet. Sonst sind es einfach 20 Zeichen nacheinander.
    🙂



  • Hallo zusammen. Ich bins nochmal, komme einfach nicht weiter =(. Will eigendlich nur dass Struct Array in f2 ausgeben lassen.

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    
    void f1(struct person *);
    void f2(struct person *);
    
    struct person{
    	char name[20]; 
    	char firstname[20]; 
    	char birthday[11];
    };
    
    void f1(struct person *uebergabe)
    {
    	int ia;
    	for(ia = 0; ia < 3; ia++)
    	{
    		printf("Bitte geben sie den Namen von Person %d ein:\n", ia + 1);
    		scanf("%s",(uebergabe + ia)->name);
    		printf("Bitte geben sie den Vornamen von Person %d ein:\n", ia + 1);
    		scanf("%s",(uebergabe + ia)->firstname);
    		printf("Bitte geben sie den Geburtsdatum von Person %d ein:\n", ia +1);
    		scanf("%s",(uebergabe + ia)->birthday);
    
    	}
    }
    
    void f2(struct person *uebergabe)
    {
    	int ib;
    	for(ib = 0; ib < 3; ib++)
    	{
    		printf("Name von Person &d: %s\n", ib + 1, *(uebergabe + ib)->name);
    		printf("Vorname von Person &d: %s\n",ib + 1, *(uebergabe + ib)->firstname);
    		printf("Geburtstag von Person &d: %s\n",ib + 1, *(uebergabe +ib)->birthday);
    	}
    }
    
    int main(void){
    
    	struct person aPer[3], *uebergabe;
    	uebergabe = aPer;
    
    	f1(uebergabe);				//Eingabe
    	f2(uebergabe);				//Ausgabe
    
    	_getch();
    	return EXIT_SUCCESS;
    
    }
    


  • Mein Compiler hat folgendes geliefert:

    ./structs.c||In function ‘f2’:|
    ./structs.c|35|warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’|
    ./structs.c|35|warning: too many arguments for format|
    ./structs.c|36|warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’|
    ./structs.c|36|warning: too many arguments for format|
    ./structs.c|37|warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘int’|
    ./structs.c|37|warning: too many arguments for format|
    ||=== Build finished: 0 errors, 6 warnings ===|
    

    Das sind Warnungen und die sollte man ernst nehmen.

    printf("Name von Person &d: %s\n", ib + 1, *(uebergabe + ib)->name);
    

    Also stimmt irgend etwas nicht mit deinem printf nicht. Da steht ein &d soll das etwa %d sein? Du übergibst ja zwei Parameter.

    So verbessert.

    ./structs.c||In function ‘f2’:|
    ./structs.c|35|warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’|
    ./structs.c|36|warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’|
    ./structs.c|37|warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’|
    ||=== Build finished: 0 errors, 3 warnings ===|
    

    printf erwartet ein Zeiger auf char, du übergibst aber ein integer oder char.
    Also ist die Dereferenzierung zu viel.

    printf("Name von Person %d: %s\n", ib + 1, *(uebergabe + ib)->name);
                                               ^ Zuviel
    

Anmelden zum Antworten