genau 30 zeichen einlesen
-
so hab ich auch gedacht, aber es funktioniert nicht so richtig...
ich habe einen pointer auf das char array in einer struktur und lese dann so ein:
printf("enter name of film\n"); fignore(stdin); //damit getchar() und standardeingabe funktionieren while((c = getchar()) != '\n') { if(i < MAX_NAME) //30 elemente ptr->name[i++] = c; } ptr->name[i] = '\0'; i = 0; printf("enter genere(s) of film\n"); while((c = getchar()) != '\n') { if(i < MAX_GENERE) //50 elemente ptr->genere[i++] = c; } ptr->genere[i] = '\0';
wenn ich jetzt zwei uebergrosse strings eingebe, dann ueberschreibt der string der zweiten eingabe den ersten string..
-
Genau 30 Zeichen? Da solltest du es mal mit fread() versuchen. (oder du rufst in einer Schleife 30x fgetc() auf)
(PS: "Genre" schreibt man mit nur 2 'e' ;))
-
Genau 30 Zeichen?
ich meinte das im sinne von bis zu 30 zeichen
oder du rufst in einer Schleife 30x fgetc() auf
hier bei habe ich dann wieder das selbe problem wie ich zwei beitraege weiter oben geschildert habe
PS: "Genre" schreibt man mit nur 2 'e'
ups
-
hat keiner ideen? ich hab mich daran festgebissen und mittlerweile allen moeglichen schwachsinn ausprobiert und glaube komme von allein nicht weiter...
-
Was hast du denn gegen fgets()? Das liest maximal x Zeichen, bis es auf das Dateiende oder einen Zeilenumbruch trifft.
btw, deine Schleife solltest du vorzeitig abbrechen, wenn du genug Zeichen hast:
while((c = getchar()) != '\n') { if(i < MAX_NAME) //30 elemente ptr->name[i++] = c; else break; }
-
wenn ich es genauso mache dann kommt immer folgendes:
die eingabe
enter name of film dies ist ein langer sinnloser text den ich hier eingebe um die funktion des programmes zu testen enter genere(s) of film aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
die ausgabe
name..........dies ist ein langer sinnloser aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZ genere........aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaZ
der eine string schreibt sich immer noch in den ersten
-
Ich glaube, der Fehler liegt völlig woanders. Es scheinen die Zielbereiche überschrieben zu werden. Wie sehen denn die Code-Schnipsel zu der Struktur, auf die ptr zeigt, bzw. die Zuweisung an ptr aus????
-
ich quote mich mal selber
wenn ich jetzt zwei uebergrosse strings eingebe, dann ueberschreibt der string der zweiten eingabe den ersten string
Wie sehen denn die Code-Schnipsel zu der Struktur, auf die ptr zeigt, bzw. die Zuweisung an ptr aus????
was meinst du? was ist bitte ein code-schnipsel einer struktur?
-
ich beschreibe jetzt einfach mal den kompletten ablauf meines programmes:
die struktur:
struct dvd { char name[MAX_NAME]; char genere[MAX_GENERE]; int length; int size; int parts; };
relevant davon sind name und genre
die main funktion:
struct dvd **data; data[i++] = dvd_add(); //zum einlesen output(data[choice-1]); //zur ausgabe
die funktion dvd_add();
static struct dvd *ptr; ptr = (struct dvd *)malloc(sizeof(struct dvd)); printf("enter name of film\n"); fignore(stdin); while((c = getchar()) != '\n') { if(i < MAX_NAME) ptr->name[i++] = c; } ptr->name[i] = '\0'; i = 0; printf("enter genere(s) of film\n"); while((c = getchar()) != '\n') { if(i < MAX_GENERE) ptr->genere[i++] = c; } ptr->genere[i] = '\0';
die ausgebe:
void output(struct dvd *out_p) { printf("+++++++++++++++++++++++++++++++++++++++++++\n"); printf("name..........%s\n", out_p->name); printf("genere........%s\n", out_p->genere); printf("length........%d minutes\n", out_p->length); printf("size..........%d MB\n", out_p->size); printf("parts.........%d\n", out_p->parts); printf("+++++++++++++++++++++++++++++++++++++++++++\n"); }
ich denke aber nicht dass irgendetwas hierdran falsch ist...
-
Was hälst du davon:
... funktion dvd_add();
static struct dvd *ptr; int i; <======= int c; ptr = (struct dvd *)malloc(sizeof(struct dvd)); printf("enter name of film\n"); fignore(stdin); i = 0; <======= irgendwie zeigt i sonst in den Wald oder???? while(((c = getchar()) != EOF) && (((char) c) != '\n')) { if(i < (sizeof(ptr->name)-1)) /* oder auch MAXNAME-1, Achtung: -1 */ ptr->name[i++] = (char) c; } ptr->name[i] = '\0'; i = 0; printf("enter genere(s) of film\n"); while(((c = getchar()) != EOF) && (((char) c) != '\n')) { if(i < (sizeof(ptr->genere)-1)) ptr->genere[i++] = (char) c; } ptr->genere[i] = '\0';
(1) "i" ist wohl nicht korrekt belegt (scheint auch nicht funktions-lokal zu sein)
(2) ptr->name wird komplett belegt inkl. dem Platzhalter für das null-Byte. ptr->name[i] zeigt bereits auf das erste Byte von ptr->genere. Mit Zuweisung auf ptr->genere wird das null-Byte und folgende Bytes mit "aaa..." überschrieben.
-
(1) "i" ist wohl nicht korrekt belegt (scheint auch nicht funktions-lokal zu sein)
i ist korrekt deklariert initialisiert und nur lokal sichtibar, wie auch du sicherlich bemerken wirst habe ich nicht alles kopiert, und offentsichtliches weggelassen.
ich gehe auch nicht weiter auf den rest ein, weil dort nur muell steht.
und ich druecke mich jetzt gezielt so aus, damit du merkst wie du dich verhaelst.
-
... wo ist das Problem?
Du gehst in Deinen "while-Schleifen" jeweils genau einen Schritt zu weit. Das wollte ich mit meiner Anmerkung (2) ausdrücken. Am Ende der while-Schleife gilt:
i == MAXNAME
und folglich:
&ptr->name[i] == &ptr->genere[0]
ptr->name lässt sich aber nur mit einem Index 0 .. (MAXNAME-1) ansprechen.
ptr->name[MAXNAME] ist aber bereits ptr->genere[0].
Ich hoffe, ich habe mich jetzt verständlicher ausgedrückt. Sonst helfe ich gerne noch weiter.
-
hattest recht, MAX_NAME und MAX_GENERE musste um einen gekuerzt werden.
aber ich verstehe nicht wieso du den restlichen code veraendern musstest/hast...
aber danke
-
Moh schrieb:
aber ich verstehe nicht wieso du den restlichen code veraendern musstest/hast...
... was hatte ich da geändert??? Mal sehen:
(1)
while(((c = getchar()) != EOF) && (((char) c) != '\n'))
ich habe mir immer angewöhnt, Fehlersituationen/Returnwerte abzufangen. getchar() liefert halt im Fehlerfall EOF zurück. Muss man nicht abfangen (ist bei "normaler" interaktiver Eingabe im vorliegenden Fall auch nicht nötig). Ich mach's halt immer (ist ja auch nur als Vorschlag zu sehen
(2)
if(i < (sizeof(ptr->name)-1))
ist auch nur ein Vorschlag/Idee, man braucht dann nicht großartig nachzusehen, welche Konstante benutzt wird, um das Strukturelement "name" zu definieren. Mach ich fast immer so bei String-Operationen (z.B. auch bei strncmp()). Funktioniert leider nicht, wenn Speicher für das Strukturelemente "name" mittels malloc() alloziiert wird. Wie gesagt, nur 'ne Idee (ich gucke mir immer gerne mal anderen Code an, das erweitert den Wissenshorizont
(3) getchar() liefert den Typ "int" zurück, deshalb muss bei den anschließenden Vergleichen/Zuweisungen mit "(char)" gecastet werden, da sonst einige Compiler meckern.
Ich hoffe jedenfalls, dass Dein Program jetzt besser rennt. Sah mir halt tierisch danach aus, dass Speicherbereiche übermangelt wurden...