Hiho,
Ich dachte mir mal, ich schreib ein kleines tutorial über sscanf weil ich glaube das die meisten nicht wissen das man es auch für mehr als nur befehle benutzen kann.
In diesem tutorial werde ich euch zeigen was sccanf ist, welche funktionen es hat und wie es funktioniert mit ein paar beispielen.
Eins vorweg:
1. In diesem tutorial geht es um das sscanf 2.0 plugin von Y_Less. Ich kann nicht garantieren das alles was ich hier sage auch mit älteren versionen funktioniert!
2. Ich bin nicht allwissend. Es gibt dinge die ich auch nicht weiss, dies werde ich aber auch dazu schreiben. Wenn jemand etwas weiss wo ich geschrieben habe das ich es nicht weiss, bitte bescheid sagen dann editier ich es rein (komischer satz^^).
Alles klar fangen wir mal an^^
Was ist sscanf?
Die meisten werden sscanf wohl schon kennen wenn sie sich mit parametern für befehle auseinander gesetzt haben. Sei es dcmd,ocmd,zcmd oder (hier beliebeigen bustaben aus dem alphabet einfügen)cmd. Allerdings kann sscanf für mehr als nur parameter von befehlen benutzt werden. Beispielsweise um daten aus einer tabelle (MySQL) auszulesen (mehr dazu weiter unten).
Welche funktionen hat sscanf?
Als erstes sollte man die parameter kennen die man benötigt um z.b integer von string oder float zu unterscheiden.
[table='4']
[*]Parameter
[*]Name
[*]Erklärung
[*]Beispiel
[*]i, d
[*]Integer
[*]Eine einfache Zahl.
[*]-314, -1, 0, 1, 2, 5, 8765345
[*]I, D
[*]Integer (Optional)
[*]Eine einfache Zahl.
[*]-314, -1, 0, 1, 2, 5, 8765345
[*]c
[*]Character
[*]Ein einzelner Character bzw Bustabe.
[*]a, o, *
[*]C
[*]Character (Optional)
[*]Ein einzelner Character bzw Bustabe.
[*]a, o, *
[*]l
[*]Logical
[*]Ein Logischer wert wie true (wahr) oder false (falsch).
[*]true, false
[*]L
[*]Logical (Optional)
[*]Ein Logischer wert wie true (wahr) oder false (falsch).
[*]true, false
[*]b
[*]Binary
[*]Eine Binärzahl.
[*]01001, 0b1100
[*]B
[*]Binary (Optional)
[*]Eine Binärzahl.
[*]01001, 0b1100
[*]h, x
[*]Hex
[*]Eine Hexadezimalzahl.
[*]1A, 0x23
[*]H
[*]Hex (Optional)
[*]Eine Hexadezimalzahl.
[*]1A, 0x23
[*]o
[*]Octal
[*]Ein Oktalwert.
[*]045 12
[*]O
[*]Octal (Optional)
[*]Ein Oktalwert.
[*]045 12
[*]n
[*]Number
[*]Eine einfache Zahl (Sowohl integer, als auch Binär,Hexadezimal, etc. Wert).
[*]42, 0b010, 0xAC, 045
[*]N
[*]Number (Optional)
[*]Eine einfache Zahl (Sowohl integer, als auch Binär,Hexadezimal, etc. Wert).
[*]42, 0b010, 0xAC, 045
[*]f
[*]Float
[*]Eine Gleitkommazahl.
[*]0.7, -99.5
[*]F
[*]Float (Optional)
[*]Eine Gleitkommazahl.
[*]0.7, -99.5
[*]g
[*]IEEE Float
[*]Eine IEEE Gleitkommazahl.
[*]0.7, -99.5, INFINITY, -INFINITY, NAN, NAN_E
[*]G
[*]IEEE Float (Optional)
[*]Eine IEEE Gleitkommazahl.
[*]0.7, -99.5, INFINITY, -INFINITY, NAN, NAN_E
[*]u
[*]User name/id (bots und spieler)
[*]Ein Spielername oder eine playerid. Also sowohl z.b /kick Maddin als auch /kick 0 sind möglich.
[*]Maddin, Hans, Bot1, Bot2, 0, 1
[*]U
[*]User name/id (bots und spieler) (Optional)
[*]Ein Spieler-/Botname oder eine player-/botid. Also sowohl z.b /kick Maddin als auch /kick 0 sind möglich.
[*]Maddin, Hans, Bot1, Bot2, 0, 1
[*]q
[*]Bot name/id
[*]Ein Botname oder eine botid. Also sowohl z.b /kick Beispielbot als auch /kick 0 sind möglich. Hier werden allerdings nur Bots beachtet, keine Spieler!
[*]Bot1, Bot2, 0, 1
[*]Q
[*]Bot name/id (Optional)
[*]Ein Botname oder eine botid. Also sowohl z.b /kick Beispielbot als auch /kick 0 sind möglich. Hier werden allerdings nur Bots beachtet, keine Spieler!
[*]Bot1, Bot2, 0, 1
[*]r
[*]Player name/id
[*]Ein Spielername oder eine playerid. Also sowohl z.b /kick Maddin als auch /kick 0 sind möglich. Hier werden allerdings nur Spieler beachtet, keine Bots!
[*]Maddin, Hans, 0, 1
[*]R
[*]Player name/id (Optional)
[*]Ein Spielername oder eine playerid. Also sowohl z.b /kick Maddin als auch /kick 0 sind möglich. Hier werden allerdings nur Spieler beachtet, keine Bots!
[*]Maddin, Hans, 0, 1
[*]{, }
[*]Quit section
[*]{ } Wird verwendet wenn in einem parameter zwar bestimmte zeichen vohanden sind, diese aber nicht weiter verarbeitet werden solle.
[*]{iis[128]}
[*]P
[*]Trennzeichen
[*]Ein angegebenen trennzeichen, an dem sscanf erkennt was die einzelnen werte voneinander trennt. Standartmäßigm ist es das Leerzeichen.
[*]P<|>iiii Ersetzt ungültige Trennzeichen mit einem "|"
[*]p
[*]Trennzeichen
[*]Ein angegebenen trennzeichen, an dem sscanf erkennt was die einzelnen werte voneinander trennt. Standartmäßigm ist es das Leerzeichen.
[*]p<|>iiii Ersetzt Trennzeichen mit einem "|"
[*]Z(string)[länge]
[*]Ungültiger Optionaler String
[*]Ein Ungültiger Optionaler String.
[*]-
[*]z(string)[länge]
[*]Verworfener Optionaler String
[*]Ein Verworfener Optionaler String.
[*]-
[*](string)[länge]
[*]Optionaler String
[*]Eine zeichenkette (string) mit angegebener länge. Hierbei wird die länge des strings angegeben, an den der wert übergeben werden soll.
[*]-
[*]s[länge]
[*]String
[*]Eine zeichenkette (string) mit angegebener länge. Hierbei wird die länge des strings angegeben, an den der wert übergeben werden soll.
[*]-
[*]A(default)[länge]
[*]Optionales Array des Angegebenen types
[*]Ein Optionales Array des Angegebenen types.
[*]-
[*]a[länge]
[*]Array des Angegebenen types
[*]Ein Array des Angegebenen types.
[*]-
[*]e
[*]Enum
[*]Ein Parameter, der verwendet werden kann um alle werte die sich zwischen den beiden < > befinden an ein Enum weiter zu geben.
[*]-
[*]E(default)
[*]Enum (Optional)
[*]Ein Parameter, der verwendet werden kann um alle werte die sich zwischen den beiden < > befinden an ein Enum weiter zu geben.
[*]-
[*]'string'
[*]Suchbegriff
[*]Ein Begriff nachdem im angegebenen Parameter gesucht werden soll
[*]-
[*]%
[*]Deprecated optional specifier prefix
[*]Ganz ehrlich, ich habe keine ahnung xD Wenns jemand weiss PN an mich und ich trag es nach.
[*]-
[/table]
-
Strings
-
Beschreibung
Strings werden bei sscanf mit dem parameter 's' bestimmt. -
Beispiel 1:
sscanf("hallo 123", "si", str, val);
ergibt:
Aber:
sscanf("hallo du 123", "si", str, val);
Würde nicht funktionieren, da der zweite parameter ('du') kein integer ist. -
Beispiel 2:
sscanf("hallo du", "s", str);
ergibt:
weil nach nach dem 's' parameter nichts mehr kommt
aber:
sscanf("hallo du", "s ", str);
ergibt:Aber achtung: Zusätzlich muss die Größe des strings angegeben werden, ansonsten kommt es zu fehler meldungen und es funktioniert nicht.
Beispiel:
new
str[32],
val;
sscanf("hallo du 27", "s[32]i", str, val);
-
Beschreibung
-
Arrays
-
Beschreibung:
Arrays werden bei sscanf mit dem parameter 'a' bestimmt. Zusätzlich wird der/die parameter der/die in dem Array gespeichert wird/werden mit '<' und '>' gekennzeichnet. -
Beispiel
new
arr[5];
sscanf("1 2 3 4 5", "a<i>[5]", arr);
-
Beschreibung:
-
Enums
-
Beschreibung:
Enums werden bei sscanf mit dem parameter 'e' bestimmt. Wie auch bei einem Array wird hier anfang und ende mit '<' bzw '>' gekennzeichnet. Diese funktion ist z.b zum auslesen von Spielern sehr nützlich. -
Beispiel 1:
enum PlayerData
{
pIP[16],
pName[24],
pPasswort[130],
pGeld,
pKills,
pTode,
Float: pPositionX,
Float: pPositionY,
Float: pPositionZ,
}
new SpielerInfo[MAX_PLAYERS][PlayerData];sscanf("127.0.0.1 Maddin Passwort 1000 5 7 100.00 200.0 300.0", "e<s[16]s[24]s[130]iiifff>",SpielerInfo[playerid]);
In diesem falle finden wir als erstes die daten, die nachher im enum gespeichert werden sollen. Das sind IP, Name, Passwort,Geld,Kills,Tode und die Position des Spielers.
So dann wollen wir das mal ein bisschen zersetzen.
e<s[16]s[24]s[130]iiifff>
Das 'e' beschreibt das es sich um ein enum handelt
das '<' beschreibt, das alles ab jetzt ins enum kommt. Bis es mit '>' wieder geschlossen wird
Sind die parameter die in das enum sollen. In diesem fall ein string mit der länge von 16, ein string mit der länge von 24, ein string mit der länge von 130, drei integer und drei floats.
das '>' am ende sagt das das enum ab hier zu ende ist (falls man noch weitere parameter hat die nicht ins enum sollen. -
Beispiel 2:
Diesmal lesen wir daten aus einer MySQL Tabelle aus. Ich nehme hier als Beispiel das Enum von gerade.
enum PlayerData//Das enum
{
pIP[16],
pName[24],
pPasswort[130],
pGeld,
pKills,
pTode,
Float: pPositionX,
Float: pPositionY,
Float: pPositionZ,
}
new SpielerInfo[MAX_PLAYERS][PlayerData];//-----Dann bei der funktion die den Account laden soll
new str[512];
mysql_query("SELECT * FROM `Accounts` WHERE `Spielername` = 'Maddin'");//Läd alles aus der Zeile des Spielers (in dem fall ich) aus der Tabelle 'Accounts'
mysql_store_result();
while(mysql_fetch_row(str))//Übergibt das was vorher aus der Tabelle geladen wurde an einen string.
{
sscanf(str, "e<p<|>{i}s[16]s[24]s[130]iiifff>",SpielerInfo[playerid]);//teilt den string in seine bestandteile so wie wir es wollen und gibt es an das enum weiter
}
mysql_free_result();
Erklärung:
e< - Wie oben beschrieben, sagt sscanf das alles was nun folgt (bis es mit > wieder beendet wird) in ein enum kommt.
p<|> - Wenn wir eine ganze spalte aus der Tabelle laden, werden die einzelnen felder mit einem '|' getrennt. Also z.b "Name|IP|Kills|Tode" usw. Damit sscanf das weiss geben wir es mit p<|> an.
{i} - In den meisten Tabellen befindet sich an erstel stelle eine AUTO_INCREMENT ID. Diese wird zwangsläufig mit ausgelesen, da wir ja ALLE auslesen. In unserem enum finden wir dafür aber keinerlei verwendung, deshalb wird durch { und } angegeben, das der erste parameter (in unserem falle 'i', also eine zahl) ignoriert werden soll.
s[16]s[24]s[130]iiifff - Werde ich nicht nochmal erklären, steht ja oben schon.
> - gibt an das hier das enum zu ende ist. Bei uns ist zwar dort auch die abfrage zu ende, aber theoretisch könnte ich ja noch ein paar spalten in der tabelle haben die ich dann lieber in z.b PVars speichern möchte.
-
Beschreibung:
-
Optionale Parameter
-
Beschreibung:
Jeder format parameter (das sind alle, ausser '', {} und p) haben optionale parameter. -
Beispiel 1:
"()" geben den default wert an, der bestimmt wird wenn nichts angegeben wird.
Ein kleines Beispiel:
sscanf("", "I(12)", var);
Wie wir sehen ist der main string leer (""), aber wir wollen daraus trotzdem einen integer auslesen. Dadurch das wir am ende "(12)" angegeben haben, weiss sscanf das, wenn keine zahl im main string vorhanden ist, es diese mit 12 ersetzen soll. -
Beispiel 2:
sscanf("1 2", "A<i>(3)[4]", arr);
Hier soll sscanf ein Array mit 4 zahlen auslesen. Im string sind aber nur 2 angegeben ("1 2"). Deshalb sagen wir das der default wert 3 ist ( "(3)").
Ausgegeben wird nun:
Warum? Ganz einfach: Wir haben ein Array mit 4 zahlen, aber nur 2 angegeben. Also ersetzt sscanf alle fehlenden mit dem von uns festgelegten default wert, also 3.
-
Beschreibung:
Ich hoffe ich konnte euch damimt wenigstens ein bisschen helfen.
Bei fragen einfach melden, entweder hier per antwort oder im Dark-Trigardon Forum.
Fehler bitte auch melden damit ich sie korrigieren kann.
Bei bedarf wird es noch erweitert.
Mfg.
//Edit 1: Fehler ausgebessert. Danke an Dudalus.
//Edit 2: Funktions Tabelle überarbeitet.
//Edit 3: Beschreibungen Hinzugefügt.
//Edit 4: Tabelle gefixxt.
//Edit 5: Tabelle gefixxt². Danke an SpySpy.