Liste von strukturierten Datentypen, weitere Elemente hinzufügen mit einer Funktion
-
struct eintrag { //Struktur eintrag char name[20]; char vorname[16]; char nummer[16]; }; //Feld-Variable liste mit MAX_EINTRAG Feldern vom Typ eintrag static struct eintrag kontakte[MAX_ANZAHL] = { {"Meier","Karl","0123456/789"}, // Beispiel für ersten Eintrag };
//Funktion Eingabe eines neuen Kontaks int hinzufuegen(struct eintrag kontakte[], int anzahl) { if (anzahl != MAX_ANZAHL) { printf("Neuen Kontakt eingeben!\n"); scanf("Name: %s", &kontakte[anzahl].name); scanf("Vorname: %s", &kontakte[anzahl].vorname); scanf("Nummer: %s", &kontakte[anzahl].nummer); int eingeleseneWerte = scanf("Name: %s Vorname: %s Nummer: %s", kontakte[anzahl + 1].name, kontakte[anzahl + 1].vorname, kontakte[anzahl + 1].nummer); printf("%d\n", eingeleseneWerte); return anzahl; } else { printf("Liste ist voll! Bitte zuerst Eintraege löschen!\n"); } return 0; }
int main() { int anzahl = 1; int auswahl; ................ case 2: printf("Sie haben 'Liste ausgeben' gewaehlt\n"); ausgabe(kontakte, anzahl); break; // betreffende Zeile in der main-Funktion
Wenn ich Versuche einen neuen Kontakt hinzuzufügen, hängt sich das Program auf. Beim Dubuggen werden die Zeilen 5,6,7 nicht richtig ausgeführt. Sprich es wird nicht auf Eingabe des Nutzers gewartet.
Danke für eure Hilfe.
-
Wie wird auswahl in
main
eingelesen?Lass die & weg.
kontakte[anzahl].name ist schon eine Adresse
-
@furk sagte in Liste von strukturierten Datentypen, weitere Elemente hinzufügen mit einer Funktion:
scanf("Name: %s", &kontakte[anzahl].name);
Kann es sein dass du den "format" Parameter von
scanf
falsch verstanden hast?
So wie das dasteht müsste der Benutzer erstName:
und dann seinen Namen eingeben damit es funktioniert.
Wenn du möchtest dassName:
als Eingabeaufforderung hingeschrieben wird, dann musst du das vorher mit z.B.printf
oderfwrite(stdout)
ausgeben.Ich vermute was du willst ist:
printf("Name: "); scanf("%19s", &kontakte[anzahl].name);
ps: Falls jemand weiss wie man es vermeiden kann die "19" da als Magic-Number in den Format-String reinzuschreiben... lasst es mich wissen.
-
@hustbaer sagte in Liste von strukturierten Datentypen, weitere Elemente hinzufügen mit einer Funktion:
ps: Falls jemand weiss wie man es vermeiden kann die "19" da als Magic-Number in den Format-String reinzuschreiben... lasst es mich wissen.
Du kannst den Formatstring mit sprintf zusammen klöppeln.
oder
beiscanf_s
musst du noch die Länge als extra Parameter mit angeben - ist daher kein 1:1 Ersatz fürscanf
-
@DirkB sagte in Liste von strukturierten Datentypen, weitere Elemente hinzufügen mit einer Funktion:
@hustbaer sagte in Liste von strukturierten Datentypen, weitere Elemente hinzufügen mit einer Funktion:
ps: Falls jemand weiss wie man es vermeiden kann die "19" da als Magic-Number in den Format-String reinzuschreiben... lasst es mich wissen.
Du kannst den Formatstring mit sprintf zusammen klöppeln.
Ja, stimmt, danke! Daran hatte ich nicht gedacht. Natürlich kann man auch defines für die Grösse verwenden und diese dann "stringizen". Finde ich aber beides nicht sehr schön.
-
@hustbaer
Macht man sowas nicht mitfgets()
?fgets(kontakte[anzahl].name, sizeof(kontakte[anzahl].name), stdin);
-
@KeinNutzer0 hattest du nicht die Absicht, dich hier nicht weiter aufzuhalten?
-
@hustbaer sagte in Liste von strukturierten Datentypen, weitere Elemente hinzufügen mit einer Funktion:
ps: Falls jemand weiss wie man es vermeiden kann die "19" da als Magic-Number in den Format-String reinzuschreiben... lasst es mich wissen.
#define MAX_FOO 19 char foo[MAX_FOO + 1]; scanf("%" MAX_FOO "s", foo);
// oh, das sagtest Du ja schon
-
@KeinNutzer0 sagte in Liste von strukturierten Datentypen, weitere Elemente hinzufügen mit einer Funktion:
@hustbaer
Macht man sowas nicht mitfgets()
?fgets(kontakte[anzahl].name, sizeof(kontakte[anzahl].name), stdin);
Im Fall des OP ist vermutlich wirklich
fgets
besser, da er vermutlich gar nicht beim ersten Leerzeichen abbrechenwürdewill (wasscanf
ja macht aberfgets
nicht) und nur genau einen String pro Aufruf einlesen will.
Ansonsten kommt es halt drauf an was man braucht.