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
-
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 alsoroot
bin
daemonNur 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"