Array überläuft!



  • Hi Leutz,

    ich hoffe, dass Thema gibt es noch nicht. Habe auf die Schnelle nichts gefunden.
    Meine Frage: Wie kann ich verhindern, dass das Feld überläuft? Am Besten eine Schleife, damit der Nutzer die Eingabe dann wiederholen muss. Bin für jede Hilfe dankbar. MfG

    Bloß ein Beispiel:

    #include <stdio.h>
    #include <stdlib.h>
    #define FELD 30
    
    int main (void)
    {
    char *kette1=NULL;
    
    kette1 = malloc(FELD);
    
    fgets(kette1, FELD, stdin);
    
    free(kette1);
    
    return 0;
    
    }
    


  • Ich denke, es gibt keine Pi-Mal-Daumen Regel dafür, es kommt auf die Funktion an, die du benutzt, um Daten zu lesen. Ich würde aber folgendes machen: immer merken, wie viel Speicher ich zur Verfügung habe, wie viel ich bereits benutze und wie viel ich gerade gelesen habe. Dann weißt du, ob der Speicher ausreicht.



  • Ich glaube, dass ich ein Denkfehler habe. Wenn ich die Eingabe mit "Enter" bestätige, dann ist es ja bereits zu spät. fgets liest doch sofort die gesamte Zeichenkette ein, oder? Kann ich ein Überlaufen überhaupt verhindern?

    Oder, wenn ich das Feld auf 10 beschränke und die Eingabe 15 Zeichen wären. was passiert dann genau, bzw. was macht fgets dann genau?



  • fgest liest nur max. so viele Zeichen ein, wie du angegeben hast (bzw. eins weniger, da es noch das Nullterminierungszeichen dran hängt), d.h. es kann zu keinem Pufferüberlauf kommen (im Gegensatz zu gets()).
    Wenn du auch noch den Rest der Eingabe lesen willst, dann müßtest du halt nochmal fgets() aufrufen.



  • okay, aber warum passieren bei mir komische sachen, wenn ich mehr Zeichen eingebe als reserviert ist? Hängt der dann am Ende, wenn zu viele Zeichen sind, ein \n ran statt \0??? Werde noch Irre. :xmas2:



  • also, wer lesen kann, ist klar im Vorteil. Aus der fgets Doku kann man folgendes entnehmen:

    char buffer[MAX_LEN];
    
    fget(buffer, MAX_LEN, stdin);
    
    • fgets liest bis zu MAX_LEN - 1 Zeichen, weil fgets immer ein \0 anhängt
    • Wenn fgets ein \n findet und es wurden noch nicht MAX_LEN - 1 Zeichen gelesen, dann tut fgets das \n in den Puffer rein, dann ein \0 und beendet.
    • D.h. fgets liest bis zu MAX_LEN - 1 Zeichen und hört auch bei dem ersten Auftretten vom \n Zeichen auf.
    • Wenn fgets MAX_LEN - 1 Zeichen gelesen hat, dann tut ein \0 Zeichen am Ende des Puffers und lässt den Rest des Eingabepuffers (stdin z.b.) so, wie es war, d.h. fgets leert den Eingabepuffer nicht

    Wortlaut der man page

    man fgets schrieb:

    fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. A '\0' is stored after the last character in the buffer.



  • Man könnte auch zur Not nen Eimer drunterstellen, dann geht der Arrayinhalt nicht so schnell verloooren. 🙂


Anmelden zum Antworten