vscanf, vfscanf und vsscanf - Beispiele



  • Hi, ich habe im internet und hier gesucht nur nichts gefunden.
    Deshalb bitte ich euch mir jeweils 1 beispiel zu schreiben 😃
    Ich habe schon selber versucht nur zur keinen ergebnissen gekommen.
    Am besten einfache beispiele.

    Vielen dank



  • man: vprintf und Kollegen sind die va_arg-Versionen der normalen printf-Funktionen 😉 D.h. anstelle der freien Parameter gibst du einen zuvor initialisierten va_arg an, z.B.:

    char * rprintf(int count,const char *fmt, ...)
    {
      char *p;
      va_list ap;
    
      if ((p = malloc(count)) == NULL)
        return (NULL);
      va_start(ap, fmt);
      vsnprintf(p, count, fmt, ap);
      va_end(ap);
      return (p);
    }
    

    (leicht geändertes Beispiel von der obigen Manual-Seite - übergibt den Ausgabestring als Rückgabewert)



  • da hab ich ja meine probleme, ich habs ja auch so gemacht aber irgendwas ist falsch 😞



  • Ja, ich liebe diese klaren Fehlerbeschreibungen 🤡
    oder anders: Was genau hast du gemacht? Und was ist falsch?



  • die vprintfs wollen pointer auf eine va_args.



  • HI, also ich hab die anderen schon hingekriegt nur noch das vsscanf kriege ich es nicht hin. Hier mal ein beispielprog, wo der fehler ist:

    #include <stdio.h>
    #include <stdarg.h>
    
    char *mysscanf(char *string1,...)
    {
      va_list argzeiger;
      va_start(argzeiger, string1);
      vsscanf (string1,"%s",argzeiger);
      va_end(argzeiger);
    }
    
    int main(int argc, char *argv[],... )  {
    	char str3[20];
    	//char str4[20];
    	printf("Geben Sie eine Zeichenkette:");
    	mysscanf(str3);
    	//while(getchar()!='\n');
    	printf("vsscanf: %s\n",str3);
    
    	return 0;
    }
    

    Weisst einer wie ich das beheben kann? Ich hab schon viel versucht 😡

    vielen dank



  • Erstmal benötigst du beim main keine Ellipse (",..."). Und dann mußt du deiner Funktion mindestens zwei Parameter übergeben, damit sie richtig arbeitet (vsscanf liest den ersten Parameter (in deinem Beispiel string1=str3) und schreibt die gefundenen Werte in die va_list (argzeiger - weist bei dir auf Müll-Daten).

    Außerdem - wenn dein Formatstring fest vorgegeben ist, weißt du auch, wieviele und welche Parameter du benötigst, dann sind die v*scanf Funktionen überflüssig 😉



  • Die Ellipse war ein zurückgebliebener Test 😉
    Leider weisst es immer noch auf Müll-Daten 😞
    Hier der bearbeitende Code:

    #include <stdio.h>
    #include <stdarg.h>
    
    char *mysscanf(char *string1,char *string2,...)
    {
      va_list argzeiger;
      va_start(argzeiger, string2);
      vsscanf (string2,"%s",argzeiger);
      va_end(argzeiger);
    }
    
    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;
    }
    


  • myscanf() war in der oberen Version schon richtig - in der jetzigen Version hast du das dazu passende main().
    (va_start() beginnt mit dem ersten namenlosen Parameter der Funktion - wenn du nur für die benannten Parameter Werte übergibst, kann das nichts werden)



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


Anmelden zum Antworten