fgets anstatt gets = problem :-/



  • hallo,

    ich möchte anstatt gets fgets benutzen damit ich keinen buffer-overflow
    riskiere!

    nur wenns vorher so ging:

    gets(name);
    if(!strcmp(name,"test")) printf("yo!!!!\n");
    

    muss ichs mit fgets so machen:

    fgets(name,sizeof(name),stdin);
    if(!strcmp(name,"test\n")) printf("yo!!!!\n");
    

    und das mit dem \n verstehe ich irggendwie nicht und stört auch
    z.b: bei einer ausgabe in einem satz 😕

    wie kann ich das verhindern?

    danke, Babelduo



  • Hallo,
    fgets und gets sind zwei völlig unterschiedliche Funktionen.
    Mit fgets kannst du Daten entweder Zeilenweise oder nach x Zeichen aus einer Datei in den Puffer laden.
    Mit gets machst du im Prinzip das selbe, bloss lädst du hier nicht von der Datei, sondern von der Tastatur.
    Aufruf von fgets:
    char *fgets(char *buffer, int n, FILE *stream);



  • Nein ist schon richtig was er macht. Das '\n' ist bloß da weil du das Zeilenende miteinliest. Das sollte aber bei gets() ebenfalls so sein.

    Wo genau ist deine Frage?

    MfG SideWinder



  • SideWinder schrieb:

    Das sollte aber bei gets() ebenfalls so sein.

    gets liest das \n zwar ein, schreibt es aber nicht in den Puffer. IIRC.



  • zum thema: schreib dir eine trim funktion, die vom string ende alle 0x0D und 0x0A durch 0x00 ersetzt. so kriegst du die umbrüche weg.

    (meine lösung. wers besser macht, ich bin gespannt.)



  • hmm anders gehts nicht?
    naja ok ... danke!



  • gibt es denn nicht noch eine andere funktion (ausser scanf,gets,fgets)?
    denn das mit dem zeilenumbruch bei fgets ist nicht so gut 😕

    wenn nicht dann wird man wohl mit leben müssen 😉



  • Du könntest dir selber noch so eine Funktion zusammenbauen mit getch() z. B.

    Allerdings ist das fgets() sehr gut, dass auch der Zeilenumbruch mitgegeben wird. Dadurch erkennst du nämlich, dass die Zeile bzw. Eingabe wirklich zuende ist oder, wenn es nicht da ist, dass sie noch nicht vollständig eingelesen wurde.

    Beispiel:
    Du liest mit fgets() maximal 10 Zeichen ein. Wenn der Benutzer 8 Zeichen eingibt, kommt auch der Zeilenumbruch mit, d. h. es wurde alles eingegeben. Nun gibt der Benutzer aber 15 Zeichen ein. Deswegen kommt beim ersten fgets() kein Zeilenumbruch, was für das Programm heißt, dass da noch was im Tastaturpuffer steht, also liest du nochmal mit fgets() ein und erhältst dann den Zeilenumbruch. Dadurch erreichst du, dass du nicht nur 10 Zeichen von 15 einlesen kannst, sondern alle 15.


Anmelden zum Antworten