Telefonliste (Eingabe und Ausgabe)



  • Hi!

    Möchte mittels folgendem Code erst einmal eine Telefonliste mit Vor-/Nachnamen und Nummer anlegen und mittels scanf einlesen und zur Kontrolle ausgeben, leider scheitert es daran, dass bei Ausführung nach Eingabe im ersten Schleifendurchlauf das Programm abschmiert.

    Vielleicht findet Jemand den Fehler?

    Hier der Code:

    #include <stdio.h>
     #define INHALT 5
     typedef struct liste{
     	char prename[20];
     	char rename[20];
     	int number;
     }list;
    
     int main(){
     	list daten[INHALT];
     	int i;
     	printf("Geben Sie bitte die Daten von %i Personen an:\n",INHALT);
    
     	for(i=0;i<INHALT;i++){
     	printf("Vorname:\n");
     	scanf("%s",daten[i].prename);
     	printf("Nachname:\n");
     	scanf("%s",daten[i].rename);
     	printf("Telefonnummer:\n");
     	scanf("%i",daten[i].number);
     }
     	printf("Ihre Eingaben:\n\n");
     	for(i=0;i<INHALT;i++){
     		printf("Vorname: %s\t Nachname: %s\t Nummer: %i",daten[i].prename,daten[i].rename,daten[i].number);
     		printf("\n");
    
     }
    }
    


  • Das Problem liegt in Zeile 23. scanf(..) erwartet einen Pointer auf int aber du übergibst einen int . Es muss also heissen

    scanf(" %i",&daten[i].number);
    

    Übrigens heisst das nicht prename und rename sondern first name und last name (oder surname) 😉



  • Auch ist eine Telefonnummer kein int .

    Nummern mit Vorwahlen fangen mit einer Null an.

    oder forename, given name
    und family name
    Meint jedenfalls leo.org



  • ...



  • Bei mehr als 19 Zeichen der Namen liegt undefiniertes Verhalten vor.



  • icarus2 hat zwar bereits die Lösung beschrieben, dennoch solltest du auch den Code Aufbau überarbeiten, damit er auch verständlich ist, nicht nur für dich in diesen Tagen.

    Zuerst solltest du die Formatierung korrigieren. Richtige Einrückungen machen den Code leichter lesbar.

    Auch die Namen sind schlecht gewählt. Du solltest schon bei einer Sprache bleiben.
    INHALT -> ENTRIES
    typedef struct liste{...}list -> typedef struct{...}entry;
    prename -> first_name
    rename -> last_name
    number -> phone_number
    daten -> list

    Und zu guter Letzt sind die Datentypen verbesserungswürdig. Eine Telefonnummer wird zwar "Nummer" genannt, ist aber eigentlich ein Identifizierungsname aus Nummern (denke an führende Nullen), daher wähle dafür auch einen String.
    Desweiteren ist mit 19 Zeichen ein Name in seiner Größe ziemlich begrenzt, also investiere gerne ein paar mehr Bytes.



  • icarus2 schrieb:

    scanf(" %i",&daten[i].number);
    

    Auch wenn int das falsche Format für eine Telefonnummer ist und dieser Formatstring so nicht zum Einsatz kommt, noch ein paar Anmerkungen dazu:

    %i liest vorzeichenbehaftete Ganzzahlen ein. Dabei erkennt es automatisch, welche Zahlenbasis genommen wird.
    Bei einem vorangestellten 0x wird zur Basis 16 ausgewertet (hexadezimal).
    Bei einer führenden Null wird zur Basis 8 ausgewertet (oktal).
    Gerade letzteres kann zu merkwürdigem Verhalten führen (wenn die Vorwahl mit angegeben wird).

    Und %i überliest auch führende Whitespace. Daher ist das Leerzeichen im Formatstring überflüssig (schadet hier aber auch nicht).

    (%u verhält sich entsprechend, allerdings nimmt es nur positive Zahlen entgegen)


Log in to reply