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