Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • 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:

        Code
        hallo
        123


        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:

        Code
        hallo du


        weil nach nach dem 's' parameter nichts mehr kommt
        aber:
        sscanf("hallo du", "s ", str);
        ergibt:

        Code
        hallo


        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);


    • 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);


    • 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.


    • 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:

        Code
        1, 2, 3, 3


        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.



    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.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

    5 Mal editiert, zuletzt von maddin ()

  • Logicaltrue - Angenommen du lädst aus einer config einen Eintrag "b_PrintDebug" kannst du sowohl true als auch false angeben.

    Zitat

    b_PrintDebug = false

    Könntest natürlich auch 0 oder 1 anstatt false oder true benutzten. Bei L / l erkennt sscanf aber sowohl"true" als auch "false" als Angabe,ob es bei Logical auch 0 und 1 weiss ich nicht( Müsste man im Sourcecode nachschlagen ).
    Außerdem heisst es nur Logical, nicht Logicaltrue.Bei Y_Less sind dort im Post überall keine Leerzeichen zwischen dem Titel und dem ersten Beispiel ;).



    Binärcode - Nützlich beim auslesen von Bitflags.
    //00000011101111
    enum ( <<= 1)
    {
    e_Flag_Inventory_Health_S = 1,
    e_Flag_Inventory_Health_M,
    e_Flag_Inventory_Armor_S,
    e_Flag_Inventory_Armor_M,
    e_Flag_Inventory_Joint,
    e_Flag_Inventory_Wine,
    e_Flag_Inventory_Beer,
    e_Flag_Inventory_Sprunk,
    e_Flag_Inventory_Bomb,
    e_Flag_Inventory_Detonator,
    e_Flag_Inventory_Fight_Normal,
    e_Flag_Inventory_Fight_KungFu,
    e_Flag_Inventory_Fight_Boxing,
    e_Flag_Inventory_Fight_Wrestle
    }
    Anhand des Binärcodes kann ich auslesen,welche Flags enthalten sind ( e_Flag_Inventory_Health_S , e_Flag_Inventory_Health_M , e_Flag_Inventory_Armor_S , e_Flag_Inventory_Armor_M , e_Flag_Inventory_Wine, e_Flag_Inventory_Beer, e_Flag_Inventory_Sprung ) .
    Das ist aber ein riesen Kapitel,sehr sehr Nützlich.Nutzt aber leider kaum einer :/.
    "g" heisst wie es dort auch steht IEEE Float / IEEE Gleitkommazahl.Ist Platzhalter "f" + ein paar besondere Zahlen wie NaN,Unendlich ( INFINITY ) .Die können dann als Text "NaN" oder "INFINITY" ausgelesen werden und richtig in einer Variable gespeichert werden.
    In der Tabell ist "u" 2x angegeben.
    Bei "z" solltest lieber schreiben dass dieser unnötiger ist,da alles über Großschreibung Optional wird und die später im Tutorial darauf ein gehst.
    Finde du solltest nochmal etwas zu den Quiet Sections schreiben und zeigen wie man den p - Platzhalter benutzt.Denn Ich glaube du hast nirendwo erwähnt,dass man nun das Trennsymbol zwischen < und > setzt.
    p<,>
    Finde die Farbwahl für dein Beispiel auch etwas grell,musste wirklich genau hingucken :(.


    Boah fast nur negatives geschrieben,sollte Ich wohl noch etwas abrunden.
    Nee,gefällt mir dass hier wenigstens einer das sscanf Plugin benutzt.Wollte auch schon seit langem mal mein Tutorial mit sscanf v2 erweitern, hab aber nie Zeit gefunden es fertig zu schreiben.Eventuell solltest du auch überlegen nicht noch leichtere Beispiele anzugeben,denn Ich glaube kaum,dass jeder auf den ersten Blick versteht was du genau machst.
    An sonsten,gutes Tutorial :thumbup:

    Einmal editiert, zuletzt von Goldkiller ()

  • Erstmal danke fürs Feedback ^^
    Ja ich bin nicht der beste im Tutorial schreiben und wie gesagt kenne ich manche sachen selbst nicht. Ich werds morgen übernehmen was du geschrieben hast, hab grad keine zeit.^^


    Mfg.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • Hallo


    Sehr schön, habe das Ganze mal durchgelesen. Du hast noch einen kleinen "Fehler"(ist nicht wirklich einer), nämlich hast Du bei den Parametern P grossgeschrieben :P Gehe ich richtig in der Annahme, dass wenn ich nach :


    sscanf("hallo du", "s ", str);


    Nach dem Parameter s einen Leerschlag lasse, nur das erste Wort "ausgelesen" wird ? Werde heute mal meine Systeme umbauen.
    MfG dUDALUS

  • Moin, hab ein Problem mit sscanf:


    new fId,
    SWReason[128];


    if(sscanf(params, "iz[128]", fId, SWReason))


    hab schon alles mögliche ausprobiert, swreason sollte optimal sein, also soll auch leer sein können, daher hab ich mal mit (string) oder () oder ... prbiert, groß Z, klein z, ...


    Bekomme aber fast immer folgende Errormeldung:


    sscanf warning: Strings without a length are deprecated, plase add a destination size.
    sscanf warning: Format specifier does not match parameter count.


    und davor waren es noch andere sscanf warnings...


    mfg


    edit: mit is[128] geht es irgendwie, aber das ist ja trotzdem noch nicht ganz das, was ich möchte...


    edit2: nee, jetzt kommt da auch ein error... :S

    Einmal editiert, zuletzt von TehEbil ()

  • Zitat

    Das enum

    Enum steht für Enumerator, dieses Wort ist masculine und von daher Der enum.


    Ansonsten echt gute Sachen beschrieben, doch ein paar Beispiele mehr wie man die einzelnden Dinge einsetzen könnte wären netter.

    Why do programmers always mix up Halloween and Christmas?
    Oct 31 == Dec 25

  • Du machst es Anfängern gerade schwer das zu verstehen


    • i, d Integer -314, -1, 0, 1, 2, 5, 8765345[
    • i, d Integer Geld, Score oder Adminlevel


    Irgendwelche Zahlen machen es einen Anfänger nicht leicht, da durch zu blicken.
    Darum empfehle ich lieber einfachere Beispiele an zu geben, wo jeder Anfänger durchblicken kann ;)


    lg

  • Sachen wie Integer, string etc. sind das erste womit man beim Scripten kofnrontiert wird. Ein gewisses grundwissen setze ich einfach vorraus, da ich ja auch nicht extra erkläre was ein enum oder ein array ist. Und wenn man ein bisschen grundwissen hat, sollte man auch wissen das ein integer eine zahl ist ;)

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • Nabend,
    Wie erstelle ich damit den Befehle?
    Weil beim alten sscanf ging das ja per dcmd und jetzt weiss ich nicht wie das gehen soll deswegen frag ich hier nach ^^.



    Lg,
    Stoney_Mahoney

  • @Stoney_Mahoney:
    Genau wie beim alten. Nur halt bei strings musst du zusätzlich die länge angeben.


    @All:
    Heute gabs ein wichtiges update für das SSCANF 2.0 Plugin. Also solltet ihr alle Updaten wenns geht.


    //Edit:
    Zeex & smeti haben sich (vorerst) um das Problem gekümmert, was nach den R3/R4/R5 Releasen auftrat, da y_less im Urlaub ist für ~2 Wochen.
    Download

    The fact is, I am right. And if you think I'm wrong, you are wrong.

    Einmal editiert, zuletzt von maddin ()

  • Für alle leute die Probleme mit sscanf und der neuen SA-MP Version haben:


    I modified the "u" "q" and "r" specifiers to use zeex's sampgdk instead of memory hacking. I tested the "u" specifier on windows server 0.3d RC8 and it worked for me. Use at your own risk.


    http://solidfiles.com/d/bf88/
    (.dll, .so, and source)


    Thank you JerneJL for compiling the .so

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • [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]


    Maddin's Tabelle nochmal ordentlich gemacht.
    Super Tutorial maddin

  • Find ich ein gutes Tutorial.
    Ist für mich persönlich eine wichtige Funktion, wenn ich scripte und es gibt viele, die dadurch die Befehle vollkommen versemmeln.


    Danke dafür!

  • Hallo Leute, ich habe folgendes Problem, und zwar mache ich folgendes:
    new temp[6][128];
    sscanf(string, "a<p<,>s[128]>[6]", temp);


    Wenn ich das derart mache, bekomme ich folgende Warnings in der Console:

    Zitat

    [21:13:59] sscanf warning: Unclosed specifier parameter, assuming '<', consider using something like p<<>.
    [21:13:59] sscanf error: String/array must include a length, please add a destination size.


    Was mache ich da falsch?


    MFG
    Ben


    Edit:
    Habe es vorher schon so probiert:
    new temp[6][128];
    sscanf(string, "p<,>a<s[128]>[6]", temp);

  • Glaube einen ganz kleinen Fehler entdeckt.
    Bei:


    Zitat

    aber:
    sscanf("hallo du", "s ", str);
    ergibt:
    hallo

    ergibt das doch eigentlich hallo du, oder hab ich das falsch verstanden?

    Die besten Zitate aus dem sa-mp.de Forum

    Zitat

    -Wenn hier die sache nicht drine ist aber sie brachen es vlt kann ich es und dann mache ich es für sie!)

    Zitat

    Die Prüfungen(Fahrprüfungen), welche sehr realitätsnah entworfen sind, kann jeder Spieler allein absolvieren ohne auf andere angewiesen zu sein.

    Zitat

    Features: Ausgeprägte und leicht verständliche Serverregeln!

    Zitat

    aber wer dumme Antworten gibt bekommt eine Dumme zurück ... und chill mal dein Leben!

    Zitat

    Ich bin für Luca, wieso weiß ich nicht, aber der andere hat so hässlige Haare..

    Zitat

    Ich habe mir eig. immer nur die Castings angesehen, weil die da immer Runtergemacht wurden.

    Zitat

    Unknown processor
    übersetzt (by google translator)
    unbekannten Prozessor

    Zitat

    Verkaufe Minecraft Keys
    Nur für 20,-€ PaySafeCard.
    Unfassbar in mindestens 5 Minuten hast du dein Key!

  • das leerzeichen macht hallo du zu 2 strings also muss man sscanf("hallo du","ss",str,str2);
    z.B. so ;D es sind 2 verschiedene strings ^^ genauso funktioniert das ja auch bei befehlen es erkennt die leerzeichen und braucht dann um beides zu sichern 2 strings.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen