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