struct teile einlesen



  • Also ich hab nen Problem, ich will bei nem Programm 3 Datensätze einlesen, die
    chars und ints enthalten.

    Beim einlesen des Integers hängt sich das Prog auf, und ich finde den Fehler einfach nicht.

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    struct Buchbestand
    {
    	char Autor[20];
    	char Buchtitel[20];
    	int Erscheinungsjahr;
    	int Isbn;
    }titel1,titel2,titel3;
    
    void main()
    {   
    
    	printf("Bitte ersten Datensatz eingeben:\n");
    	printf("Autor:");
    	scanf("%s\n",titel1.Autor);
    	printf("Buchtitel:");
    	scanf("%s\n",titel1.Buchtitel);              
    	printf("Erscheinungsjahr:");
    	scanf("%S\n",titel1.Erscheinungsjahr);      // hier hängt sich das Prog auf?
    	printf("ISBN (ohne Bindestrich):");
    	scanf("%S\n",titel1.Isbn);
    
    	printf("Bitte zweiten Datensatz eingeben:\n");
    	printf("Autor:\n");
    	scanf("%s",titel2.Autor);
    	printf("Buchtitel:\n");
    	scanf("%s",titel2.Buchtitel);
    	printf("Erscheinungsjahr:\n");
    	scanf("%s",titel2.Erscheinungsjahr);
    	printf("ISBN (ohne Bindestrich):\n");
    	scanf("%s",titel2.Isbn);
    
    	printf("Bitte dritten Datensatz eingeben:\n");
    	printf("Autor:\n");
    	scanf("%s",titel3.Autor);
    	printf("Buchtitel:\n");
    	scanf("%s",titel3.Buchtitel);
    	printf("Erscheinungsjahr:\n");
    	scanf("%s",titel3.Erscheinungsjahr);
    	printf("ISBN (ohne Bindestrich):\n");
    	scanf("%s",titel3.Isbn);
    
    }
    


  • Du willst einen String einlesen, aber Erscheinungsjahr ist vom Typ int, als lies mit %i oder %d anstatt %s bei scanf ein.



  • Erstens: Es heißt "int main()"

    Zweitens: Schau dir mal die Bedeutung der man: scanf(3) Formatstrings an - int Werte liest du mit %i ein

    Drittens: ob eine ISBN sinnvoll in eine int-Variable verstaut werden kann, wage ich zu bezweifeln (vor allem: Wie willst du die Prüfziffer 'X' unterbringen?).



  • die ISBN soll ohne Bindestrich untergebracht werden, als zahlenwert im prinzip.

    ja ich weis int main um den speicher nicht voll zu müllen...



  • Dragonslayer schrieb:

    ja ich weis int main um den speicher nicht voll zu müllen...

    heh?



  • naja bei void main müllt mman ja den RAM voll weil man kein return 0; nutzen kann

    hm irgendwie hat %i jetzt auch nicht wirklich geholfen, das Prog hebt sich wieder auf..

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    
    struct Buchbestand
    {
    	char Autor[20];
    	char Buchtitel[20];
    	int Erscheinungsjahr;
    	int Isbn;
    }titel1,titel2,titel3;
    
    int main()
    {   
    
    	printf("Bitte ersten Datensatz eingeben:\n");
    	printf("Autor:");
    	scanf("%s",titel1.Autor);
    	printf("\nBuchtitel:");
    	scanf("%s",titel1.Buchtitel);
    	printf("\nErscheinungsjahr:");
    	scanf("%i",titel1.Erscheinungsjahr);
    	printf("\nISBN (ohne Bindestrich):");
    	scanf("%i",titel1.Isbn);
    
    	printf("\n\nBitte zweiten Datensatz eingeben:");
    	printf("\nAutor:\n");
    	scanf("%s",titel2.Autor);
    	printf("Buchtitel:\n");
    	scanf("%s",titel2.Buchtitel);
    	printf("Erscheinungsjahr:\n");
    	scanf("%i",titel2.Erscheinungsjahr);
    	printf("ISBN (ohne Bindestrich):\n");
    	scanf("%i",titel2.Isbn);
    
    	printf("Bitte dritten Datensatz eingeben:\n");
    	printf("Autor:\n");
    	scanf("%s",titel3.Autor);
    	printf("Buchtitel:\n");
    	scanf("%s",titel3.Buchtitel);
    	printf("Erscheinungsjahr:\n");
    	scanf("%i",titel3.Erscheinungsjahr);
    	printf("ISBN (ohne Bindestrich):\n");
    	scanf("%i",titel3.Isbn);
    return 0;
    }
    


  • Dragonslayer schrieb:

    naja bei void main müllt mman ja den RAM voll weil man kein return 0; nutzen kann

    wie kommst'n auf sowas 😕



  • Dragonslayer schrieb:

    naja bei void main müllt mman ja den RAM voll weil man kein return 0; nutzen kann

    nö. Programm wird trotzdem ordnungsgemäß beendet und aus'm Speicher entfernt. Nur ist void main halt nicht standardkonform.

    hm irgendwie hat %i jetzt auch nicht wirklich geholfen, das Prog hebt sich wieder auf..

    Mit scanf kennst du dich nicht so aus, hm?

    Sonst wüsstest du, dass scanf einen Zeiger als Parameter erwartet:

    scanf("%i",&titel1.Erscheinungsjahr);
    scanf("%i",&titel1.Isbn);
    


  • Dragonslayer schrieb:

    die ISBN soll ohne Bindestrich untergebracht werden, als zahlenwert im prinzip.

    Erstens ist der Datenbereich von int etwas begrenzt (bei 4 Byte kommst du bis ca. 2 Millionen, das heißt, du kannst nur englische und französische Bücher (siehe ISBN) speichern.
    Zweitens kann als letzte Ziffer der ISBN auch ein 'X' auftauchen - und das kannst du nicht in einer int-Variable unterbringen.
    Und drittens "rechnet" man gewöhnlich nicht mit ISBN-Nummern.
    -> insgesamt wäre es wohl besser, stattdessen ein char-Array zu verwenden.

    ja ich weis int main um den speicher nicht voll zu müllen...

    Das hat nichts mit "Speicher vollmüllen" zu tun - 'int main()' und 'int main(int,char**)' sind schlichtweg die einzigen im Standard vorgesehenen Varianten der main-Funktion.

    Zu deiner Korrektur: scanf() muß die Adresse der Variablen kennen, in die es einlesen soll - char-Arrays kannst du normal übergeben (werden automatisch in einen Zeiger auf den Anfang umgewandelt), aber bei normalen Variablen benötigst du den Adress-Operator:

    scanf("%i",/*->*/&titel1.Erscheinungsjahr);
    

Log in to reply