vscanf, vfscanf und vsscanf - Beispiele



  • kannst du bitte mir zeigen wie es richtig isr?
    ich kriegs net hin 😞



  • Muß man hier alles selber machen 🤡 Du hast doch beide Teile schon geschrieben und ich hatte dir gesagt, was zusammen gehört:

    char *mysscanf(char *string1,...)
    {
      va_list argzeiger;
      va_start(argzeiger, string1);
      vsscanf (string1,"%s",argzeiger);
      va_end(argzeiger);
    }
    //btw, wieso ist die eigentlich als "char*" deklariert, wenn sie nichts zurückgeben will?
    
    int main(int argc, char *argv[] )  {
        char str3[20];
        char str4[20];
        printf("Geben Sie eine Zeichenkette ein:");
        mysscanf(str4, str3);
        //while(getchar()!='\n');
        printf("vsscanf: %s\n",str3);
    
        return 0;
    }
    //wenn du die Kommandozeilen-Parameter nicht brauchst, reicht hier auch "int main()"
    

    PS: vsscanf dient nicht zum Eingeben von Tastatur, sondern zum parsen von vorhandenen Strings.



  • ich habs nicht so gepeillt 🙂
    und ich glaube ich hab das nicht so richtig verstanden *vollverwirrt*:

    vsscanf dient nicht zum Eingeben von Tastatur, sondern zum parsen von vorhandenen Strings.

    Edit:
    Und da fehlt was:
    char str4[20] = "Hallo";



  • maximo schrieb:

    ich habs nicht so gepeillt 🙂
    und ich glaube ich hab das nicht so richtig verstanden *vollverwirrt*:

    vsscanf dient nicht zum Eingeben von Tastatur, sondern zum parsen von vorhandenen Strings.

    Lies dir mal die Manuals zu den scanf-Funktionen durch - die Kürzel am Anfang des Namens erklären die jeweilige Funktion: scanf() liest von Tastatur, fscanf() aus einem File, sscanf() aus einem übergebenen String (genauer char*), v... ist die jeweils zugehörige va_list-Version.

    (Oder im Klartext - der Hinweis "Geben Sie eine Zeichenkette ein:", den dein Programm liefert, ist etwas irreführend ;))



  • danke für die erklärung, ich dachte es mir schon so 😉

    (Oder im Klartext - der Hinweis "Geben Sie eine Zeichenkette ein:", den dein Programm liefert, ist etwas irreführend ;))

    Auf jeden fall. Dieses v hat mich bisschen in die irre geführt 😉



  • 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