Frage zu sscanf()



  • Hi ich hab eine Datei in der Daten in folgendem Format abgespeichert sind:

    root:x:3:666:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    

    Nun will ich die 2te Zahl nach dem x extrahieren(666,1,2...), ich habe das so probiert:

    sscanf(str,"%%:%%:%%:%d:%%",x);
      sscanf(str"%%:x:%%:%d:%%",x);
      sscanf(str"%n:%n:%n:%d:%n",x);
      sscanf(str"*:*:*:%d:*",x);  
    ...
    

    Kommt aber immer 0 raus, was mache ich falsch? Laut manpage sollte man unerwünschtes mit %% oder * "ausklammern" können.
    Gruß HiFish



  • man: sscanf:

    Following the % character, introducing a conversion, there may be a number of flag characters, as follows:

    * Suppresses assignment. The conversion that follows occurs as usual, but no pointer is used; the result of the conversion is simply discarded.

    [...]

    Das habe ich auf die Schnelle zu dem Thema gefunden, damit dürfte es richtig heißen:

    sscanf(str,"%*[^:]:x:%*d:%d",&n);
    //          ^"root"  ^3  ^666
    


  • es geht dank dir!



  • Ich hab nochmal eine Frage zu sscanf(),
    und zwar ich will jetzt auch noch den Namen auslesen also

    root
    bin
    daemon

    Nur leider leist de rmir immer die ganze Zeile aus, den ":" erkennt er anscheinend nicht als Trennungszeichen (wenn man dez. einlesen will funktioniert der ":" komischerweise),mit nem Leerzeichen gehts ohne Probleme, hab da jetzt alles ausprobiert was mir einfiel aber nichts funktioniert. Hat irgendwer nen tipp?
    Gruß HiFish



  • %s verwendet nur whitespaces als Trennzeichen - wenn du etwas anderes haben willst, benötigst du %[ (genauer: "%[^:]" - liest alle Zeichen aus der angegebenen Menge "alles außer :").



  • ersetzt er die dann mit " " oder laesst er sie einfach weg?

    edit: ok er ersetzt sie mit " " jetzt gehts 🙂 Danke!



  • scanf hört auf zu lesen, wenn er ein für die Formatkennung unpassendes Zeichen gefunden hat (bzw. schreibt die Ausgabevariable und setzt mit dem nächsten Zeichen des Formatstrings fort).

    char* val="root:x:3:666:root:/root:/bin/bash";
    char name[20];
    sscanf(val,"%[^:]",name);
    

    -> in name steht jetzt "root\0"


Anmelden zum Antworten