Mit (s)scanf() XML - Daten Lesen
-
Hey Leute
Ich habe mal wieder ein Problem.
Man hat mir davon abgeraten String-Verarbeitung in C mit dem strtok()-Befehl zu machen sondern stattdessen die sehr starke sscanf-Funktion zu benutzen.Jetzt komme ich darauf aber leider nicht so richtig klar.
Folgende Zeilen müssen u.a. eingelesen werden und jeweils die portid, das protocol und der status, bei hosts der hostname in jeweils andere String-Variablen gespeichert werden:<hostname name="test02.meinedomäne.de" type="PTR"/> <port protocol="tcp" portid="3389"><state state="open" reason="syn-ack" reason_ttl="128"/><service name="ms-wbt-server" method="table" conf="3"/></port> <port protocol="tcp" portid="5357"><state state="open" reason="syn-ack" reason_ttl="128"/><service name="wsdapi" method="table" conf="3"/></port> <port protocol="tcp" portid="8081"><state state="open" reason="syn-ack" reason_ttl="128"/><service name="blackice-icecap" method="table" conf="3"/></port>
hatte mal versucht mit
unsigned int portid; LINE_IN = strstr(LINE_IN, "portid=\""); sscanf(LINE_IN, "portid=\"%u\"", portid);
aber das hat nichts als speicherfehler gegeben ..
Liebe Grüße und Danek für alle Antworten,
Felix
-
Du musst als Ziel nicht die Variable, sondern ihre Adresse angeben.
-
Okay jetzt funktionierts schon aber nur wenn ich den String vorher abschneide .. gibt es irgendein Zeichen,d ass als Platzhalter dient?
Ich müsste nämlich aus der eingelesenen Zeile protocol="%s" portid="%u" name="%s" auslesen. dazwischen kann es auch mal vorkommen dass ein Argument fehlt und nicht alle zeilen gleich aussehen .. also zB dass bei der port-zeile "<port ..." das reason="syn-ack" fehlt ...
ich bräuchte für den sscanf-aufruf also sowas wie:
sscanf(LINE_IN, "<PLETZHALTER> protocol=\"%s\" <PLATZHALTER> portid=\"%u\" <PLATZHALTER> name=\"%s\"", myprotocol, myportid, myservice_name);
Jemand eine Lösung ?
-
Nein, variable Strings kannst du mit einem sscanf nicht erschlagen.
Du musst schon selbst hantieren, z.B.int main() { char *p="<PLETZHALTER> protocol=pp11 <PLATZHALTER> portid=12345 <PLATZHALTER> name=pp22"; { char s[100],s1[100],s2[100]; unsigned i=0,u; while(1==sscanf(p+=i,"%99s%n",s,&i)) if(strstr(s,"protocol=")==s) strcpy(s1,s+9); else if(strstr(s,"name=")==s) strcpy(s2,s+5); else if(strstr(s,"portid=")==s) sscanf(s+7,"%u",&u); printf("%s %s %u",s1,s2,u); } return 0; }