Array of structure



  • Also scanf speichert die Werte, die eingegeben werden unter der Adresse von *database[i]. Wenn nun %7s angegeben wird, werden nur die ersten 7 Zeichen gespeichert, richtig? Das heißt, wenn ich 012345 eingebe, werden diese gespeichert inklusive des String-Endes '0'.



  • Tergo schrieb:

    Wenn nun %7s angegeben wird, werden nur die ersten 7 Zeichen gespeichert, richtig? Das heißt, wenn ich 012345 eingebe, werden diese gespeichert inklusive des String-Endes '0'.

    "012345" sind aber 6 Zeichen.

    Preisfrage: wie viele Zeichen, inklusive der infamen 0, werden bei %7s gespeicher?

    [] 6 Zeichen?
    [] 7 Zeichen?
    [] 8 Zeichen?

    Nur eine Antwort ist richtig.



  • Tergo schrieb:

    Ich dachte das wäre dafür, um die Eingabe zu begrenzen 😕

    Ja, ja das ist es.

    Tergo schrieb:

    Oder muss hier eine 6 stehen?

    scanf schrieb:

    %[*][width][length]specifier

    width Specifies the maximum number of characters to be read in the current reading operation (optional).

    Tergo schrieb:

    Also scanf speichert die Werte, die eingegeben werden unter der Adresse von *database[i]. Wenn nun %7s angegeben wird, werden nur die ersten 7 Zeichen gespeichert, richtig? Das heißt, wenn ich 012345 eingebe, werden diese gespeichert inklusive des String-Endes '0'.

    012345 sind nur 6 Zeichen. Du erlaubst aber 7 Zeichen: 1234567. Und dann kommt noch automatisch die '\0'. Was dann 8 Zeichen wären. Dein Array hat aber nur Platz für 7 Zeichen.
    (Du kannst aber auch Buchstaben eingeben)



  • Das heißt es müsste einfach 6s sein? Ich dachte, man müsste die '0' am Stringende selber mit einberechnen.

    #include <stdio.h>
    #include <stdlib.h>
    #define MAXMATRNUM   6  
    #define MAXEXAMIDNUM    6
    
    struct exam
    {                                  
        char Matr[MAXMATRNUM+1];
        char ExamID[MAXEXAMIDNUM+1];
        float mark;
    };
    
    int main()
    {
        int n,i,num=0;
        printf("Please enter the number of exams:\n");
        scanf("%d", &n);
        struct exam *database;
        database = malloc (n * sizeof(struct exam));
        if (database == 0)
            return EXIT_FAILURE;
    
        for(i=0; i<n; i++)
        {
            printf("Please enter the Matriculation Number %d\n",i+1);
            scanf("%6s",&*database[i].Matr);
            printf("Please enter the Exam-ID %d\n",i+1);
            scanf("%6s",&*database[i].ExamID);
            printf("Please enter the Mark %d\n",i+1);
            scanf("%f",&database[i].mark);
        }
    
        for(i=0; i<n; i++)
        {
        if(database[i].mark>=0.7f && database[i].mark<=4.0)
        {
          num++;
        }
        }
        printf("The number of passed exams is: %d\n", num);
    
        free (database);
        return EXIT_SUCCESS;
    }
    

    So dann?



  • Tergo schrieb:

    Ich dachte, man müsste die '0' am Stringende selber mit einberechnen.

    Das tust du ja. Siehe die "+1" in der Struct-Definition.



  • Okay, das leuchtet mir ein 🙂
    Das heißt, das Programm ist nun fertig?



  • Tergo schrieb:

    Okay, das leuchtet mir ein 🙂
    Das heißt, das Programm ist nun fertig?

    Es ist niemals fertig. 😃

    Btw, um die Beziehungen zwischen Arraygröße, gewünschter Zeichenzahl und scanf-Formatstring herzustellen, beachte bitte folgenden Beispielcode:

    #include <stdio.h>
    
    // So viele Zeichen sind gewüscht
    #define STRLEN 6
    // + abschließender 0
    #define RAW_STRLEN (STRLEN+1)
    // Format String für scanf bauen
    #define STR_EXPAND(tok) #tok
    #define STR(tok) STR_EXPAND(tok)
    #define S_FORMAT "%"STR(STRLEN)"s"
    
    // Test
    int main()
    {
        char str[RAW_STRLEN];
        scanf (S_FORMAT, str);
        printf ("%s", str);
    }
    

    🙂



  • Danke für den Hinweis 🙂 Jetzt habe ich es verstanden.

    Aber soweit scheint die Aufgabe nun gelöst, oder? 🙂



  • Tergo schrieb:

    Aber soweit scheint die Aufgabe nun gelöst, oder? 🙂

    Naja, bei einem wohlwollenden Prof ist jetzt zumindest ein "Ausreichend" drin.
    Fairerweise solltest du aber Dirk aus dem C-Forum erwähnen, ohne den du die Aufgabe niemals geschafft hättest. 🙂



  • Das ist wahr. Vielen Dank an dieser Stelle nochmal allen Beteiligten für die wahnsinnige Hilfe. Ohne euch hätte ich es echt nicht geschafft 🙂 🙂


Anmelden zum Antworten