strtok | Erklärung

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
  • Wie genau muss die Erklärung sein?
    Reicht dir das hier erst mal?
    Tutorial: http://forum.sa-mp.com/showthread.php?t=188617


    Funktionen die du benötigst, für den guten Umgang mit strtok:
    stock strtok(const string[], &index) //©Jeffry
    {
    new result[20], length = strlen(string), i = index;
    while ((i < length) && (string[i] == ' ')) i++;
    strmid(result,string,i,((index = strfind(string, " ", false, i)) == -1) ? (index = length) : (index) , 20);
    index++;
    return result;
    }


    stock ReturnPlayerID(l_PlayerName[]) //©Jeffry
    {
    new l_name[MAX_PLAYER_NAME];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(!strcmp(l_name,l_PlayerName, true)) return i;
    }
    }
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerName(i, l_name, MAX_PLAYER_NAME))
    {
    if(strfind(l_name,l_PlayerName,true)!=-1) return i;
    }
    }
    return INVALID_PLAYER_ID;
    }


    stock IsNumeric(string[])
    {
    for (new i = 0, j = strlen(string); i < j; i++)
    {
    if ((string[i] > '9' || string[i] < '0')) return 0;
    }
    return 1;
    }



    Beispielbefehl:
    dcmd_befehl(playerid,params[])
    {
    new pID, tmp[20], idx;
    tmp = strtok(params, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid,0xFF0000FF,"Fehler: /befehl [playerid/SpielerName]");
    if(IsNumeric(tmp)) pID = strval(tmp);
    else pID = ReturnPlayerID(tmp);
    if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,0xFF0000FF,"Der Spieler ist nicht online");

    //Code hier.
    return 1;
    }

  • Ok, anscheinend hat mein Versuch Funktioniert.


    Aber ich finde der Befehl sieht etwas hässlig so aus, kann man den nicht schöner gestalten ?


    if(!strcmp(cmd, "/veh", true)){
    new vehicleid[20],color1[20],color2[20];
    vehicleid=strtok(cmdtext,idx);
    if(!strlen(vehicleid))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
    if(!IsNumeric(vehicleid))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
    color1=strtok(cmdtext,idx);
    if(!strlen(color1))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
    if(!IsNumeric(color1))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
    color2=strtok(cmdtext,idx);
    if(!strlen(color2))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
    if(!IsNumeric(color2))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
    new string[60];
    format(string,sizeof string,"Du hast dir ein Fahrzeug erstellt. (%i|%i,%i)",strval(vehicleid),strval(color1),strval(color2)),
    SendClientMessage(playerid,-1,string);
    new Float:mp[4];
    GetPlayerPos(playerid,mp[0],mp[1],mp[2]),GetPlayerFacingAngle(playerid,mp[3]),
    CreateVehicle(strval(vehicleid),mp[0],mp[1],mp[2],mp[3],strval(color1),strval(color2),-1);
    return 1;
    }


    mfg :thumbup:

  • Klar, oft schreibt man die strtok's auch einfach hintereinander, je nach dem wie einem das gefällt. Ändern tut es nichts.
    if(!strcmp(cmd, "/veh", true))
    {
    new vehicleid[20],color1[20],color2[20], string[60], Float:mp[4];
    vehicleid=strtok(cmdtext,idx), color1=strtok(cmdtext,idx), color2=strtok(cmdtext,idx);
    if(!strlen(color2) || !IsNumeric(vehicleid) || !IsNumeric(color1) || !IsNumeric(color2))return SendClientMessage(playerid, -1, "Syntax: /veh [FahrzeugID] [Farbe1] [Farbe2]");
    format(string,sizeof string,"Du hast dir ein Fahrzeug erstellt. (%i|%i,%i)",strval(vehicleid),strval(color1),strval(color2)),
    SendClientMessage(playerid,-1,string);
    GetPlayerPos(playerid,mp[0],mp[1],mp[2]),GetPlayerFacingAngle(playerid,mp[3]),
    CreateVehicle(strval(vehicleid),mp[0],mp[1],mp[2],mp[3],strval(color1),strval(color2),-1);
    return 1;
    }

  • Nicht direkt. Kommt auf dein Vorhaben an, aber wenn du nur solche Befehle erstellen willst, dann passt das so.
    Da strtok nicht viel macht, muss man auch nicht viel dazu wissen. Es gibt einfach nur einen String zurück, den man dann entsprechend verarbeiten muss.

  • Es ist langsamer, allerdings merkst du im Spielgeschehen keinen Unterschied, da dies weniger als Millisekunden ausmacht.
    Daher ist es für mich erste Wahl, da ich nicht von einem Plugin abhängig bin, das von Version zu Version aktualisiert werden muss.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Mit strtok kannst du strings nach Leerzeichen splitten. Mehr nicht.
    Der Rest wird ja durch andere Funktionen (z.B. strval) gemacht. Je nach dem was du auslesen willst, musst du die entsprechenden Funktionen kennen (floatstr, IsNumeric, ...).