Szerző Téma: sscanf példa  (Megtekintve 1244 alkalommal)

sscanf példa
« Dátum: 2012. május 27. - 21:11:21 »
+3 Show voters
//------------------------------------------------------------------------------
// Név: sscanf példaszkript, magyarázatokkal
// Készítõ: GameStar
// sscanf plugin, eredeti dokumentáció: Y_Less (a példák Y_Less dokumentációjára épülnek!)
// Web: gtaforum.hu, y-less.com
// Frissítve: 2012. május 20.
//------------------------------------------------------------------------------
#include <a_samp>
// Az sscanf funkció beágyazása ebbe a szkriptbe
#include <sscanf2>
// Ha egy példa nem kell, akkor tegyél az alábbi sorokban \"//\"-t elé. (kommenteld)
// Ha pedig kell, akkor töröld ki elõle.
#define EXAMPLE1
#define EXAMPLE2
#define EXAMPLE3
#define EXAMPLE4
#define EXAMPLE5
#define EXAMPLE6
#define EXAMPLE7
#define EXAMPLE8
//#define EXAMPLE9
// A példák a szkript indulásakor futnak le. Ha elindítod a szkriptet, akkor
// ellenõrizheted a leírtakat.
public OnFilterScriptInit()
{
    #if defined EXAMPLE1
// 1. PÉLDA: Az alap
    // Meg kell adni egy bemenetet, egy formátumot, és céltárolókat, amikbe az
    // értékeket szeretnéd menteni a bemenetbõl a formátum alapján.
    new
        EXAMPLE1_var0[32],
        EXAMPLE1_var1;
   
    // Az alábbi kód lefutásával az EXAMPLE1_var0 értéke \"üdv\", az EXAMPLE1_var1 értéke
    // pedig 10 lesz. A formátum egy 32 cellás karakterlánc és egy egész szám.
    sscanf(\"üdv 10\", \"s[32]i\", EXAMPLE1_var0, EXAMPLE1_var1);
    printf(\"EXAMPLE1_var0: %s\\nEXAMPLE1_var1: %i\", EXAMPLE1_var0, EXAMPLE1_var1);
    #endif
   
    #if defined EXAMPLE2
// 2. PÉLDA: Tömbök
    // A függvény lehetõvé teszi, hogy egy tömbbe mentsük bele az értékeket.
    new
        EXAMPLE2_array0[5];
    // Az alábbi kód lefutásával az EXAMPLE2_array0 minden indexbe sorra felveszi
    // az értékeket
    sscanf(\"1 2 3 4 5\", \"a<i>[5]\", EXAMPLE2_array0);
    for(new i = 0; i < sizeof(EXAMPLE2_array0); i++)
        printf(\"EXAMPLE2_array0[%i]: %i\", i, EXAMPLE2_array0);
    #endif
   
    #if defined EXAMPLE3
// 3. PÉLDA: Enum
    enum EXAMPLE3_enum0
    {
        e_integer,
        Float:e_float,
        e_string[32],
        e_character
    }
    new
        EXAMPLE3_var0[EXAMPLE3_enum0];
    // Az alábbi kód lefutásával az EXAMPLE3_var0 minden indexe felvesz egy értéket
    // a megadott formátum alapján
    sscanf(\"1 12.0 Bob c\", \"e<ifs[32]c>\", EXAMPLE3_var0);
    printf(\"EXAMPLE3_var0[e_integer]: %i\", EXAMPLE3_var0[e_integer]);
    printf(\"EXAMPLE3_var0[e_float]: %f\", EXAMPLE3_var0[e_float]);
    printf(\"EXAMPLE3_var0[e_string]: %s\", EXAMPLE3_var0[e_string]);
    printf(\"EXAMPLE3_var0[e_character]: %c\", EXAMPLE3_var0[e_character]);
    #endif
   
    #if defined EXAMPLE4
// 4. PÉLDA: Az úgynevezett \"csendes szekció\"
    // Amelyik formátumszakaszt {} közé rakjuk, azt a függvény késõbb érzékeli,
    // de nem veszi figyelembe.
    new
        EXAMPLE4_var0,
        EXAMPLE4_var1;
    // Az alábbi kód lefutásával az EXAMPLE3_var0 értéke -100 lesz, mert az elsõ egész
    // számot (42) nem vesszük figyelembe.
    sscanf(\"42 -100\", \"{i}i\", EXAMPLE4_var0);
    printf(\"EXAMPLE4_var0: %i\", EXAMPLE4_var0);
    // Az alábbi kód lefutásával az EXAMPLE3_var1 értéke 42 lesz, mert a második egész
    // számot (-100) nem vesszük figyelembe.
    sscanf(\"42 -100\", \"i{i}\", EXAMPLE4_var1);
    printf(\"EXAMPLE4_var1: %i\", EXAMPLE4_var1);
    #endif
   
    #if defined EXAMPLE5
// 5. PÉLDA: Szöveg keresése
    // \'\' közé rakva kereshetõ egy szöveg. Ilyenkor a függvény a szöveg pozíciójára
    // ugrik, ezért a korábbi és az új pozíció közötti dolgokat nem fogja figyelembe
    // venni. Az alábbi példa is szemlélteti ezt.
    // Formátumként megadunk egy egész számot (ami az elsõ egész szám - 10), amit a
    // függvény be is olvas. Majd megkerestetjük vele a szövegben a \"szöveg\" részt,
    // és végül lekérjük az utolsó egész számot (ami a 12). A 11 kimarad, mert a keresés
    // elõtt még nem lett figyelembe véve, utána pedig a függvény nem is törõdött vele,
    // mert a keresés miatt átugrott azon a részen.
    new
        EXAMPLE5_var0,
        EXAMPLE5_var1;
    sscanf(\"10 11 szöveg 12\", \"i\'szöveg\'i\", EXAMPLE5_var0, EXAMPLE5_var1);
    printf(\"EXAMPLE5_var0: %i\\nEXAMPLE5_var1: %i\", EXAMPLE5_var0, EXAMPLE5_var1);
    #endif
   
    #if defined EXAMPLE6
// 6. PÉLDA: Az elválasztók
    // Ha a bemeneti szövegekben az értékeket valami elválasztja (mondjuk vesszõ), akkor
    // megadhatjuk a függvénynek, hogy azok mentén válassza szét az értékeket.
    // A formátuma p<elválasztó>, tehát vesszõnél p<,>
    new
        EXAMPLE6_var0,
        EXAMPLE6_var1[12],
        EXAMPLE6_var2;
    sscanf(\"1,nem,3\", \"p<,>is[12]i\", EXAMPLE6_var0, EXAMPLE6_var1, EXAMPLE6_var2);
    printf(\"EXAMPLE6_var0: %i\\nEXAMPLE6_var1: %s\\nEXAMPLE6_var2: %i\", EXAMPLE6_var0, EXAMPLE6_var1, EXAMPLE6_var2);
    #endif
   
    #if defined EXAMPLE7
// 7. PÉLDA: Választható formátumok
    // Ugyanaz, mint a sima formátum, viszont ha a függvény nem talál neki értéket,
    // abban az esetben az általunk megadott \"alapértelmezett értéket\" adja neki.
    // Csak nagybetûvel kell írni, és meg kell adni az alapértelmezett értéket.
    new
        EXAMPLE7_var0,
        EXAMPLE7_var1[16],
        EXAMPLE7_var2[5];
    // Itt nem adunk meg bemeneti szöveget, a választható egész szám alapértelmezett értékét
    // pedig 12-re állítjuk. A függvény nem fog találni értéket, így automatikusan 12-t fog
    // adni.
    sscanf(\"\", \"I(12)\", EXAMPLE7_var0);
    printf(\"EXAMPLE7_var0: %i\", EXAMPLE7_var0);
   
    // Karakterlánccal
    sscanf(\"\", \"S(alapértelmezett)[16]\", EXAMPLE7_var1);
    printf(\"EXAMPLE7_var1: %s\", EXAMPLE7_var1);
   
    // Tömbbel
    sscanf(\"\", \"A<i>(1, 2, 3, 4, 5)[5]\", EXAMPLE7_var2);
    for(new i = 0; i < sizeof(EXAMPLE7_var2); i++)
        printf(\"EXAMPLE7_var2[%i]: %i\", i, EXAMPLE7_var2);
    #endif
   
    #if defined EXAMPLE8
// 8. PÉLDA: Egyéni formátumok
    // Lehetõségünk van saját formátumokat csinálni. Csak egy SSCANF: elõtag kell.
    // Ennek is van választható, és sima fajtája is. A választható esetében, ha nem tudja
    // meghívni a saját formátum eljárását, akkor az alapértelmezett értéket adja.
    new
        EXAMPLE8_var0[16],
        EXAMPLE8_var1,
        EXAMPLE8_var2[16],
        EXAMPLE8_var3;
    sscanf(\"GameStar PLAYER_STATE_PASSENGER\", \"s[16]k<playerstate>\", EXAMPLE8_var0, EXAMPLE8_var1);
    // Az EXAMPLE7_var1 értéke 3 kell, hogy legyen.
    printf(\"EXAMPLE8_var0: %s\\nEXAMPLE8_var1: %i\", EXAMPLE8_var0, EXAMPLE8_var1);
   
    // Ha a bemenetben nincs megadva az állapot szövegesen, akkor az alapértelmezett
    // értéket (PLAYER_STATE_PASSENGER) kapjuk
    sscanf(\"GameStar\", \"s[16]K<playerstate>(PLAYER_STATE_PASSENGER)\", EXAMPLE8_var2, EXAMPLE8_var3);
    // Az EXAMPLE8_var3 értéke 3 kell, hogy legyen.
    printf(\"EXAMPLE8_var2: %s\\nEXAMPLE8_var3: %i\", EXAMPLE8_var0, EXAMPLE8_var1);
    #endif
   
    #if defined EXAMPLE9
// 9. PÉLDA: Összetettebb használat
    // A függvénnyel akár egész komplex formátumokat is csinálhatunk, íme egy példa:
    enum EXAMPLE9_enum0
    {
        Float:e_float,  // f
        e_string[32],   // s[32]
        e_character,    // c
        e_hex           // h
    }
    new
        EXAMPLE9_var0[EXAMPLE9_enum0],
        EXAMPLE9_var1,
        Float:EXAMPLE9_var2[4];
    // unformat-ot is írhatunk, az is elfogadott...
    unformat(
        \"üdv 22 nem PLAYER_STATE_DRIVER 20.0 gtaforum.hu g FF00DD\",
        \"{s[4]}\'nem\'k<playerstate>e<fs[32]ch>A<f>(1.434, 2.233, 3.262 ,4.176)[4]\",
        // A formátum szöveges magyarázata:
        // - Az elsõ szöveget (üdv) kihagyjuk a \"csendes szekcióval\".
        // - A 22-t is kihagyjuk, mert rákeresünk a következõ szövegre (nem).
        // Azzal sem törõdünk.
        // - A következõ szövegrõl (PLAYER_STATE_DRIVER) lekérdezzük a saját
        // formátumunkkal, hogy milyen érték tartozik hozzá.
        // - Ezután az enumba tartozó értékeket olvassuk ki:
        //      - A lebegõpontos értéket (20.0)
        //      - A karakterláncot (gtaforum.hu)
        //      - A karaktert (g)
        //      - A tizenhatos számrendszer beli számot (FF00DD)
        // - Választható tömbformátummal az alapértelmezett lebhegõpontos értékeket
        // fogjuk kapni, mivel nincs megadva a 4 lebegõpontos érték
        EXAMPLE9_var1,  // k<playerstate>
        EXAMPLE9_var0,  // e<fs[32]ch>
        EXAMPLE9_var2   // A<f>(1.434, 2.233, 3.262 ,4.176)[4]
    );
    printf(\"EXAMPLE9_var1: %i\", EXAMPLE9_var1);
    printf(\"EXAMPLE9_var0[e_float]: %.1f\", EXAMPLE9_var0[e_float]);
    printf(\"EXAMPLE9_var0[e_string]: %s\", EXAMPLE9_var0[e_string]);
    printf(\"EXAMPLE9_var0[e_character]: %c\", EXAMPLE9_var0[e_character]);
    printf(\"EXAMPLE9_var0[e_hex]: %x\", EXAMPLE9_var0[e_hex]);
    for(new i = 0; i < sizeof(EXAMPLE9_var2); i++)
        printf(\"EXAMPLE9_var2[%i]: %.3f\", i, EXAMPLE9_var2);
    #endif
   
    return 1;
}
// (A 8. és 9. példához) egy egyéni formátum. Megadja szöveges adat alapján számmal, hogy a játékosnak
// éppen mi az állapota.
SSCANF:playerstate(string[])
{
    // Ha a szöveg már szám formátumú
    if (\'0\' <= string[0] <= \'9\')
    {
        // Lekérjük az értékét
        new
            ret = strval(string);
        // Ha a lekért érték 0, vagy kisebb vagy egyenlõ mint 9, akkor visszaadjuk
        if (0 <= ret <= 9)
        {
            return ret;
        }
    }
    else if (!strcmp(string, \"PLAYER_STATE_NONE\")) return 0;
    else if (!strcmp(string, \"PLAYER_STATE_ONFOOT\")) return 1;
    else if (!strcmp(string, \"PLAYER_STATE_DRIVER\")) return 2;
    else if (!strcmp(string, \"PLAYER_STATE_PASSENGER\")) return 3;
    else if (!strcmp(string, \"PLAYER_STATE_WASTED\")) return 7;
    else if (!strcmp(string, \"PLAYER_STATE_SPAWNED\")) return 8;
    else if (!strcmp(string, \"PLAYER_STATE_SPECTATING\")) return 9;
   
    // Ha nem találtunk a megadott szöveghez azonosítót, akkor -1-el tér vissza
    return -1;
}

 
Formátumtáblázat: http://gtaforum.hu/index.php?topic=13404.0
« Utoljára szerkesztve: 2012. május 27. - 21:14:17 írta GameStar »

Nem elérhető BoSS

  • 816
    • Profil megtekintése
sscanf példa
« Válasz #1 Dátum: 2012. május 27. - 21:13:43 »
0 Show voters
Szép ment a +

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
sscanf példa
« Válasz #2 Dátum: 2012. május 27. - 22:04:16 »
0 Show voters
zsíír!!

Nem elérhető Amf

  • 1459
    • Profil megtekintése
sscanf példa
« Válasz #3 Dátum: 2012. május 29. - 00:56:36 »
0 Show voters
Szokásos GameStar! Szép munka!
Bár az sscanf-ot csak a ZCMD-vel használom!
Ment a plusz!

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal