vscanf, vfscanf und vsscanf - Beispiele



  • Die scanf-Funktionen sind Teufelszeugs und sollten nie
    verwendet werden. Das Zeugs ist einfach viel zu unsicher und
    gerade bei der Verwendung von Dateien als Eingabe sogar
    fahrlässig.



  • Hast du eine bessere Methode, unter ANSI C Daten einzulesen? Dann immer her damit 😉



  • die gibt es auch z.b. vscanf 😃



  • maximo, und warum soll die sicherer sein?



  • maximo schrieb:

    die gibt es auch z.b. vscanf 😃

    Tolle Idee - weil die scanf Familie zu unsicher ist, nehmen wir halt vscanf 🤡



  • sorry, ich les nur vom buch ab 😉
    vscanf ist von C99 und dachte es ist sicherer?



  • halbwissen ist gefaehrlich.
    glaube umsomehr.



  • CStoll schrieb:

    Hast du eine bessere Methode, unter ANSI C Daten einzulesen? Dann immer her damit 😉

    Ja, z. B. strtok.

    Buffer aufmachen, file einlesen udn mit strtok die einzelnen
    tokens auslesen. Ist viel schneller und tausendmal zuverlässiger.



  • maximo schrieb:

    sorry, ich les nur vom buch ab 😉
    vscanf ist von C99 und dachte es ist sicherer?

    Also hier ein aus dem Kopf geschriebens Beispiel:

    /* Datei öffnen */
    FILE *p_file = fopen ("C:\\Datei", "rb");
    if (p_file == NULL)
    {
    return FALSE;
    }

    // Dateigröße bestimmen.
    struct _stat state;
    _fstat (fileno(p_file), state);
    size_t len = state.st_size;

    // Speicher entsprechender Größe allokieren
    char *p_buffer = malloc (len+1);
    if (p_buffer == NULL)
    {
    fclose (p_file);
    return -1;
    }

    // Datei lesen
    if (fread (p_buffer, 1, len, p_file)
    {
    fclose (p_file);
    free (p_file);
    return -2;
    }

    fclose (p_file);

    char *p = p_buffer;

    // Zum Beispiel csv parsen
    while ((p = strtok (p, ",\n")) != NULL)
    {
    /* Hier jetzt den gelesenen Wert verarbeiten.
    in p steht genau der Wertz der durch z. B.
    , oder \n getrennt wurde.
    */
    }
    free (p_buffer);
    }



  • Sicher könnte diese Variante sicherer sein, aber ob sie wirklich einfacher anzuwenden ist als die scanf-Funktionen wage ich zu bezweifeln:

    1. _fstate() ist afaik keine Standard-Funktion
    2. Einlesen von Tastatur wirst du damit auch nicht hinbekommen (oder schaffst du es, alle vom User kommenden Eingaben bei Programmbeginn zu bekommen?)
    3. korrekt parsen mußt du deine Daten an dieser Stelle auch noch

    PS: und "free(p_file);" ist nonsens 😉


Anmelden zum Antworten