dynamisches sscanf()?



  • Hi,

    wenn ich sowas baue, dann ist das recht klar:

    sscanf(instr,"%d %d %f %f %s",&i1,&i2,&d1,&d2,s)

    Hier wird instr geparst und die ergebnisse - zwei int, zwei float und ein char-array - in die Variablen geschrieben, die als weitere Parameter übergeben werden.

    Allerdings hätte ich das gerne dynamisch, sprich der User kann den Formatstring frei definieren. Dazu müssen die Variablen, in welche die Ergebnisse geschrieben werden, entsprechend anders angeordnet werden. Nur: wie löse ich das? Die parameter für sscanf() lassen sich nicht dynamisch zusammenbauen, alle möglichen Kombinationen von Variablentypen kann ich nicht abfangen (es sind zu viele) und wenn ein falscher Typ in eine Variable geschrieben wird, dann knallt es.

    Wie also kann man sowas dynamisch hinkriegen?



  • Naja, selbst wenn das ginge, wäre es mit dem Format-String ja nicht getan - woher wüsstest du, welches %d sich auf welchen Integer bezieht?

    Ansonsten könnte man das aber beispielsweise so machen:

    void *scanf_parameter[5];
    
    scanf_parameter[0] = &i1;
    scanf_parameter[1] = &i2;
    scanf_parameter[2] = &d1;
    scanf_parameter[3] = &d2;
    scanf_parameter[4] = s;
    
    sscanf(instr, fmt_string_gut_geprueft_mehrere_ausrufungszeichen,
           scanf_parameter[0],
           scanf_parameter[1],
           scanf_parameter[2],
           scanf_parameter[3],
           scanf_parameter[4]);
    

    Wobei du natürlich höllisch aufpassen musst, dass der Benutzer dir einen Format-String andreht, der auch auf die Parameter passt - das ganze Unterfangen ist so höchst gefährlich. Wahrscheinlich tätest du besser daran, den Benutzer keine Format-Strings hereinreichen zu lassen, sondern speziell definierte und in der Funktionalität auf das erlaubte eingeschränkte Spezifikationsstrings, mit denen du die Tokens jeweils einzeln parsen kannst.

    Das muss nichts kompliziertes sein; ein einfacher String, in dem jedes einzelne Zeichen einen Wert bezeichnet, dann kannst du in einer Schleife mit switch, sscanf und dem %n-Spezifikator durch den Eingabestring durchgehen.


Anmelden zum Antworten