genau 30 zeichen einlesen



  • 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...


Anmelden zum Antworten