Programm stürzt an bestimmten Punkt immer ab



  • Huhu,

    ich habe ein Beispiel vom C von A bis Z Buch zu Strukturen nachprogrammiert.

    Beim Auswahlpunkt 4 soll er die Strukturen anhand des Nachnamens in alphabetische Reihenfolge bringen.

    Wenn ich 2 Strukturen angelegt habe und die Funktion dann ausführe, stürzt das Programm immer ab... weiß allerdings nicht wieso.

    // struct_arr2.c S.398
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX 20
    
    static int x = 0;
    
    struct adres
    {
           char nname[MAX];
           char vname[MAX];
           int alter;
    } adressen[100];
    
    //-1- Eingabefunktion
    struct adres eingabe (struct adres neu[], int nr)
    {
           printf ("--- Eingabe ---\n");
           printf ("Nachname: ");
           fgets (neu[nr].nname, MAX, stdin);
           printf ("Vorname: ");
           fgets (neu[nr].vname, MAX, stdin);
           printf ("Alter: ");
           scanf ("%d", &neu[nr].alter);
    }
    
    //-2- Bestimmte Adresse ausgeben
    void suche (struct adres search[], int nr)
    {
         int i;
         char buchstabe;
    
         printf ("Anfangsbuchstaben eingeben: ");
         scanf ("%c",&buchstabe);
    
         for (i=0; i < nr; i++)
         {
             if (search[i].nname[0] == buchstabe)
             {
                        printf ("--- gefunden ---\n");
                        printf ("Name......... %s", search[i].nname);
                        printf ("Vorname...... %s", search[i].vname);
                        printf ("Alter........ %d", search[i].alter);
                        printf ("\n\n");
             }
             else
                 printf ("Nicht gefunden...\n");
         }
    }
    
    //-3- Alle ausgeben
    void ausgabe (struct adres ausgabe[], int nr)
    {
         int i;
         for (i=0; i < nr; i++)
         {
             printf ("Name......... %s", ausgabe[i].nname);
             printf ("Vorname...... %s", ausgabe[i].vname);
             printf ("Alter........ %d", ausgabe[i].alter);
             printf ("\n\n");
         }
    
    }
    
    //-4- Adressen sortieren
    void sortieren (struct adres sortieren[], int nr)
    {
         int i,j;
         struct adres *temp;
    
         for (i=0; i < nr; i++)
         {
             for (j=0; j < nr; j++)
             {
                 if (strcmp (sortieren[i].nname, sortieren[j].nname) > 0)
                 {
                            *temp = sortieren[j];
                            sortieren[j] = sortieren[i];
                            sortieren[i] = *temp;
                 }
             }
         }
         printf ("Sortiert!\n");
    }
    
    int main (void)
    {
        int auswahl;
    
        //Schleife Auswahlkatalog
        do
        {
             printf ("\n-------------- Auswahl --------------\n");
             printf ("-1- Neue Adresse anlegen\n");
             printf ("-2- Bestimmte Adresse ausgeben\n");
             printf ("-3- Alle Adressen ausgeben\n");
             printf ("-4- Adressen sortieren\n");
             printf ("-5- Programm beenden\n");
             printf ("\n Ihre Auswahl: ");
             scanf ("%d", &auswahl);
             fflush (stdin);         
             printf ("\n");
    
             switch (auswahl)
             {
                    case 1 : eingabe (adressen, x++);
                             break;
                    case 2 : suche (adressen, x);
                             break;
                    case 3 : ausgabe (adressen, x);
                             break;
                    case 4 : sortieren (adressen, x);
                             break;
                    case 5 : break;
                    default : printf ("Falsche Eingabe\n");
             }
    
        } while (auswahl != 5);
    
        getchar ();
        return 0;
    }
    


  • Ich kann nirgends einen Schutz vor dem Überlauf des Strukturarrays adressen sehen, der sollte noch mit rein. Vielleicht war das der Grund für deinen Absturz...
    Wieso übergibst du eigentlich das Strukturarray als Parameter, wenns sowieso global ist?



  • Weisst du wo der Absturz erfolgt? Dann hast du auch den Fehler gefunden und kannst ihn leicht korrigieren. Die Vermeidung und die Suche von Fehlern gehört nun mal auch zur Programmierung. Du kannst das z.B. mit Debug machen oder den Ablauf des Programmes mit Kontrollausgaben verfolgen. Vielleicht kannst du mit den Ausführungen zu einer Protokolldatei auf meiner Homepage http://berniebutt.npage.de auf der Seite 'Programmierung/Protokolldatei' etwas anfangen.


Anmelden zum Antworten