Problem mit scanf
-
Hallo,
ich hab mal eine Frage ich habe folgendes Programm:
# include <stdio.h> # include <string.h> # include <stdlib.h> int main() { char* name[10]; int mat[10]; int i; char test[21]; int mat2; printf( "Beispieleingabe: \n"); for( i = 0; i < 10; i++) { name[i] = (char *) malloc (21 * sizeof(char)); scanf( "%20s %7d",name[i], &mat[i]); fflush(stdin); } scanf( "%7d", &mat2); fflush(stdin); scanf( "%20s", test); fflush(stdin); for( i= 0; i < 7; i++) { if (mat[i] == mat2) { printf( "Name zu Mat.Nummer %d ist %s\n", mat2, name[i]); break; } else { continue; } } for( i = 0; i < 10; i++) { if( strcmp(name[i], test) == 0) { printf( "Die Mat.Nummer zu %s ist %d\n", test, mat[i]); break; } else { continue; } } // Speicher freigeben for( i = 0; i < 10; i++) free(name[i]); return 0; }
Das Problem ist wenn Namen länger als 20 sind oder eben die mat Nummer länger als 7, rutscht es in die nächste zeile des Arrays mit hinein, kann mir jemand helfen, weiß grad nicht wie ich da weiterkomme,
Danke
Tassadar
-
Die einfachste Lösung: Alloziere einfach mehr Speicher für die Namen (Zeile mit malloc)!
Eine schwierigere Lösung könnte z.B. sein, dass der Benutzer am Anfang eine Länge bestimmen darf. Dafür musst du mit malloc/realloc arbeiten. malloc hast du zwar verwendet, aber imho völlig umsonst, da du ja immer die gleiche Speichergröße allozierst (21 Bytes pro Name). Ein dynamisches Allozieren von Speicher macht natürlich nur Sinn, wenn da auch eine gewisse Dynamik im Spiel ist!
Ein Beispiel für malloc findest du hier (1. Seite ziemlich unten, mein Post):
-
Der Speicherplatz ist nicht das Problem.
Das Problem entsteht, wenn mehr als 20 Zeichen eingegeben werden.scanf versucht den Überschuss nach &mat[i] einzulesen, das geht schief.
Einfache Abhilfe: Name und Martikelnummer nacheinander einlesen.
-
Schon klar
, das Problem ist nur, dass das Teil der Aufgabe ist.
Es sollen 10 Personen mit den Nummern in einem Block eingelesen werden,
also:Anton 12345
Berta 4441
..... usw.Aber herzlichen Dank für die Hilfe bisher
Grüße
-
Wenn du die Eingabe in zwei Teile aufteilst, dann bekommt ein &mat[i] auch keinen Schrott ab:
int main() { char* name[10] = {0}; int mat[10] = {0}; int N = 2; int i; for( i = 0; i < N; i++ ) { name[i] = malloc ( 21 * sizeof(char) ); if ( !name[i] ) { puts("Out of memory"); return 1; } printf("name: " ); scanf( "%20s", name[i] ); ClearBuf(); printf("mat: " ); if( 1 != scanf( "%7d", &mat[i] ) ) { puts("Bad mat nr. Integer number only please"); return 1; } ClearBuf(); } for( i = 0; i < N; i++ ) { printf("name: %s mat nr: %d \n", name[i], mat[i] ); free( name[i] ); } return 0; }